我做了一个客户端程序连服务器,因为是个后台程序,没有窗口,所以我用WSAEventSelect来选择网络事件,实际运行过程中发现客户端对服务器的指令有时根本没反映,(不是每次,只是有时候,但出现频率还是比较高的),这时候好像网络单向断掉一样,因为客户端的信息可以过去,但服务器的信息却发不到客户端。我用netxray抓包,发现服务器信息已经到了客户端,为什么没收到呢?后来经我用softice跟踪客户端程序才发现,这时候根本不触发网络事件了。为什么?????????为什么有时候正常触发网络事件有时候却不触发了???

解决方案 »

  1.   

    代码太大,我贴一部分出来吧,//创建socket并连接服务端
    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卡
    }