主题 : tiny6410 wince 网口问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 80917
精华: 0
发帖: 27
金钱: 135 两
威望: 27 点
贡献值: 0 点
综合积分: 54 分
注册时间: 2012-11-01
最后登录: 2017-02-19
楼主  发表于: 2014-05-05 09:11

 tiny6410 wince 网口问题

大家好,我现在用tiny6410核心板做一个项目,主要用以太网通讯,以太网是DM9000,我在测试时发现一个问题,程序运行一段时间后网口就死掉了,PING不通了。下面是我的测试程序。



#include "stdafx.h"
#include <winsock.h>
#include <windows.h>

//#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib,"winsock.lib")

#define HEADER_LENGTH 8

#define SERVER_IP "192.168.1.24"
#define SERVER_PORT 9100

//SOCKET g_sSocketClient = INVALID_SOCKET;
char* pSendBuffer = new char[HEADER_LENGTH+5000+128];
bool SocketInit();
void SocketUninit();
bool ConnectServer(const char* ip, int port);
int RecvToSend();

int _tmain(int argc, _TCHAR* argv[])
{
    //memset(pSendBuffer, 0, sizeof(pSendBuffer));
    SocketInit();

    printf("%s\n", "> Waiting for the connection...");

    //等待连接
    ConnectPart: while (true)
        {
            //接收输入 ip 和 端口
            if (ConnectServer(SERVER_IP, SERVER_PORT))break;
        }

    while (true)
    {
        if (RecvToSend() == 0)
        {
            goto ConnectPart;
        }

        Sleep(100);
    }

    return 0;
}

bool SocketInit()
{
    WORD wVersionRequested;
    WSADATA wsaData;

    //WinSock初始化
    wVersionRequested = MAKEWORD(1, 1); //希望使用的WinSock DLL的版本
    if(WSAStartup(wVersionRequested, &wsaData) != 0)
    {
        printf("> WSAStartup() failed!\n");
        return false;
    }

    //确认WinSock DLL支持版本1.1
    if(LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1)
    {
        WSACleanup();
        printf("> Invalid WinSock version!\n");
        return false;
    }

    return true;
}

void SocketUninit()
{
    if (g_sSocketClient != INVALID_SOCKET)
    {
        closesocket(g_sSocketClient);
        g_sSocketClient = INVALID_SOCKET;
    }

    WSACleanup();
}

bool ConnectServer(const char* ip, int port)
{
    if((g_sSocketClient = socket(AF_INET, SOCK_STREAM,0)) < 0)
    {
        printf("> Init socket error!");
        return false;
    }

    struct sockaddr_in addr;
    memset((void*)&addr, 0, sizeof(sockaddr_in));
    addr.sin_family = AF_INET;
    addr.sin_port = htons(port);
    addr.sin_addr.s_addr = inet_addr(ip);

    if(connect(g_sSocketClient, (struct sockaddr*)&addr,sizeof(addr)) <0 )
    {
        closesocket(g_sSocketClient);
        g_sSocketClient = INVALID_SOCKET;
        return false;
    }
    else
    {
        const char chOpt=1;
        int nErr = setsockopt(g_sSocketClient, IPPROTO_TCP, TCP_NODELAY, &chOpt, sizeof(char));
        printf("%s\n", "> The connection is successful!");
        return true;
    }

    return false;
}

int RecvToSend()
{
    if (g_sSocketClient != INVALID_SOCKET)
    {
    

        char* pSendBuffer = new char[HEADER_LENGTH+5000+128];//我发现把这两句放到MAIN函数开始就不会出现运行一段时间后网口PING不通的现象,请问大家这是怎么//回事?
        memset(pSendBuffer, 0, sizeof(pSendBuffer));//

        pSendBuffer = (char*)0xFFFF8813;
        *pSendBuffer =  0xFFFFFFFF;
        *(pSendBuffer+1) = 0xFFFFFFFF;
        *(pSendBuffer+2) = 0xFFFFFFFF;
        *(pSendBuffer+3) = 0xFFFFFFFF;
        *(pSendBuffer+4) = 0x00880088;
        *(pSendBuffer+5) = 0x00130013;
        *(pSendBuffer+6) = 0x00000000;
        *(pSendBuffer+7) = 0x00000000;


        if (send(g_sSocketClient, pSendBuffer, HEADER_LENGTH+5000, 0) == SOCKET_ERROR)
        {
            delete [] pSendBuffer;
            printf("%s\n", "> Send the data failed!");
            return -1;
        }
        else
        {
            delete [] pSendBuffer;
            printf("%s\n", "> Send the data success!");
        }
    }

    return -1;
}