当接收到一个连接后,先向其投递一个WSARecv的操作,等待操作完成,当操作完成后处理数据,然后再次发送一个WSARecv请求来等待下次的数据。上面的逻辑没有问题吧?如果是客户端主动关闭了连接,接收操作会完成,并且numberOfBytes的值为零,服务器就可以调用closesocket来关闭连接了可如果我要服务器主动关闭连接,按理说closesocket之后客户端应该也能收到消息的当我再一次接收操作完成,投递下一个接收操作之前关闭连接的话,客户端可以正常收到连接关闭的消息可当用另外的线程来关闭连接时(这时候应该还有一个未完成的Recv操作),客户端就不知道连接已经关闭了再有,就是socket已经关闭了,那么之前投递的那个Recv操作不是就永远不能完成了?

解决方案 »

  1.   

    对了,当我关闭连接时,调用shutdown(sock, SD_SEND)总是失败,错误码是10057,不知道是什么原因
      

  2.   


    if(INVALID_SOCKET!=m_Socket)
    {
    CancelIo((HANDLE)m_Socket);
    closesocket(m_Socket);
    m_Socket=INVALID_SOCKET;
            }
      

  3.   

    closesocket隐含执行了shutdown,可以执行从容关闭确保数据都被接收。
      

  4.   

    关闭套接字后,之前的操作失败的,GetQueueCompletionStatus函数可以获取到那个操作,但是返回值是-1
      

  5.   

    我是在那个返回错误后释放的那个OVERLAPPED的东西