大家好,我现在用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;
}