我做了一个客户端程序连服务器,因为是个后台程序,没有窗口,所以我用WSAEventSelect来选择网络事件,实际运行过程中发现客户端对服务器的指令有时根本没反映,(不是每次,只是有时候,但出现频率还是比较高的),这时候好像网络单向断掉一样,因为客户端的信息可以过去,但服务器的信息却发不到客户端。我用netxray抓包,发现服务器信息已经到了客户端,为什么没收到呢?后来经我用softice跟踪客户端程序才发现,这时候根本不触发网络事件了。为什么?????????为什么有时候正常触发网络事件有时候却不触发了???
BOOL MakeClient()
{
int errno; if ( ( ss=socket( AF_INET, SOCK_STREAM, 0 ) ) == INVALID_SOCKET ) return FALSE; errno = WSAEventSelect( ss, EventArray[0], FD_CONNECT|FD_READ|FD_CLOSE );
if ( errno == SOCKET_ERROR )
{
errno = WSAGetLastError();
if ( ss != INVALID_SOCKET )
{
closesocket(ss);
ss = INVALID_SOCKET;
}
return FALSE;
}
memset( (void *)&dst_addr, 0, sizeof(dst_addr) );
dst_addr.sin_family = AF_INET;
dst_addr.sin_port = htons((unsigned short)HUPORT);
dst_addr.sin_addr.s_addr = htonl(ServerIPAddr);
if ( connect( ss, (struct sockaddr *)&dst_addr, sizeof(dst_addr) ) == SOCKET_ERROR )
{
errno = WSAGetLastError();
if ( errno != WSAEWOULDBLOCK )
{
if ( ss != INVALID_SOCKET )
{
closesocket(ss);
Sleep(100);
ss = INVALID_SOCKET;
}
return FALSE;
}
} return TRUE;
}
// 网络接收线程
DWORD WINAPI CommandThreadFunc( LPVOID lpParam )
{
HKEY hkey;
char vStr[280];
LPVOID lpv = NULL;
LPDWORD lpDW = NULL;
SMapFileBuf *lpMapFile;
int len;
DWORD stopcount,stopcount1;
DWORD eIndex;
WSANETWORKEVENTS nwe;
DWORD Netstartcount=0, Nettmpcount=0;
STRU_NETCOMM *pPacket, *cot_pPacket;
char PacketBuff[PACKET_LEN+2], cot_PacketBuff[PACKET_LEN+2]; pPacket = (STRU_NETCOMM *)PacketBuff;
cot_pPacket = (STRU_NETCOMM *)cot_PacketBuff; Netstartcount = Nettmpcount = stopcount = GetTickCount();
for ( ; ; )
{
if (TerminateThreadFlag)
{
return 0; //退出线程
} stopcount1 = Nettmpcount = GetTickCount();
if ( (Nettmpcount-Netstartcount)>1000 )
{ //每秒检测一次,如果网络未连接,则创建socket
if (!NetConnected) MakeClient();
Netstartcount = Nettmpcount;
} eIndex = WSAWaitForMultipleEvents( 1, EventArray, FALSE, 1000, FALSE );
switch( eIndex )
{
case WSA_WAIT_EVENT_0:
WSAEnumNetworkEvents( ss, EventArray[0], &nwe );
if ( (nwe.lNetworkEvents&FD_CONNECT)&&(nwe.iErrorCode[FD_CONNECT_BIT]==0) )
{
Sleep(10);
NetConnected = 1;
}
else if ( (nwe.lNetworkEvents&FD_READ)&&(nwe.iErrorCode[FD_READ_BIT]==0) )
{
len = 0;
len = recv( ss, PacketBuff, PACKET_LEN, 0 ); // 读数据
if ( len!=SOCKET_ERROR ) // 接收不到固定长度,表示接收出错
{
if ( len==PACKET_LEN ) processNetCommand(pPacket); // 处理服务器发来的命令
}
}
else if ( (nwe.lNetworkEvents&FD_CLOSE)&&(nwe.iErrorCode[FD_CLOSE_BIT]==0) )
{
huCloseSocket(); //关闭socket
}
break;
case WSA_WAIT_TIMEOUT:
break;
}
WSAResetEvent( EventArray[0] ); }
return 0;
}
void huCloseSocket()
{
// WSAEventSelect( ss, EventArray[0], 0 );
closesocket( ss );
ss = INVALID_SOCKET;
NetConnected = 0; // 指示网络连接断开
authorization = -1; // 要求重新认证身份
forcecheckcard = TRUE; // 强制检查IC卡
}