我建立客户端事件IO,支持一个SOCKET,当关闭客户端closesokcet,服务器也同样关闭与客户端相连的Socket之后,客户端WSAEnumNetworkEvents返回一直返回10038错误,为什么?

解决方案 »

  1.   

    这是一个工作线程
    CClient *pClient = (CClient*)pVoid;
    int nIndex, nErr;
    char szBuf[MAX_BUF];
    int nRecv;
    WSANETWORKEVENTS _network;
    while(true)
    {
    nIndex = WaitForSingleObject(pClient->m_wsaEvent, WSA_INFINITE);
    if (nIndex == WAIT_OBJECT_0)
    {
    ZeroMemory(&_network, sizeof(_network));
    if (WSAEnumNetworkEvents(pClient->m_sClient, pClient->m_wsaEvent, &_network) == SOCKET_ERROR)
    {
    nErr = WSAGetLastError();
    continue;
    }

    if (_network.lNetworkEvents == 0)
    {
    continue;
    }
    if (_network.lNetworkEvents & FD_CLOSE)
    {
    //if (network.iErrorCode[FD_CLOSE_BIT] == 0)
    {
    printf("colse\n");
    }
    }
    else if(_network.lNetworkEvents & FD_CONNECT)
    {
    if (_network.iErrorCode[FD_CONNECT_BIT] == 0)
    {
    printf("connected\n");
    }
    }
    else if(_network.lNetworkEvents & FD_READ)
    {
    if (_network.iErrorCode[FD_READ_BIT] == 0)
    {
    nRecv = recv(pClient->m_sClient, szBuf, MAX_BUF, 0);
    if (nRecv > 0)
    {
    sNetworkManager.OnRecv(szBuf, nRecv);
    }
    }
    }
    }
    else /*if (nIndex == WSA_WAIT_FAILED)*/
    {
    printf("exist\n");
    break;
    }
    }
    然后我在主线程里调用closesocket(); nErr = WSAGetLastError();
    nerr = 10038
      

  2.   

    同步问题。
    你在主线程中已经调用closesocket,那么socket句柄已经无效了,在工作线程中WSAEnumNetworkEvents的第一个参数已经是无效的socket句柄,所以返回10038的错误,即操作对象不是一个socket。
      

  3.   

    如果那样,我就客户端收不到FD_CLOSE,我怎么判断连接已经关闭呢?只能让服务器关闭连接我才能收到FD_CLOSE