同样,由于是异步操作,又如何来判断,WSAsend发送出去是否成功了?
谢谢

解决方案 »

  1.   

    客户端断开连接的时候,server的GetQueuedCompletionStatus会返回,并且NumberOfBytesTransferred等于零。WSASend你只能得到WOULDBLOCK状态。发送失败,等价于客户端已经断开了连接。
      

  2.   

    客户端断开连接的时候,server的GetQueuedCompletionStatus会返回,并且NumberOfBytesTransferred等于零。WSASend你只能得到WOULDBLOCK状态。发送失败,等价于客户端已经断开了连接。
    ---------
    我试过了,这样不行
      

  3.   

    微软的iocp_standard例子就是这样做的。
      

  4.   

    GetQueuedCompletionStatus的返回值如果等于ERROR_NETNAME_DELETED,则关闭此路连接。
      

  5.   

    我做过实验,是这样的。 在完成端口服务器这边我使用AcceptEx接受连接请求,并且在连接时候读取数据。结果:
       如果用户连接后,一直不发送数据,如果此时候用户断开,则会出现“客户端断开连接的时候,server的GetQueuedCompletionStatus会返回,并且NumberOfBytesTransferred等于零。”
       如果用户连接后,与服务器进行过数据交互后,如果这时候用户断开,服务器这边没有什么反应,无法从GetQueuedCompletionStatus获取通知。所以CLIENT与SERVER间要有应用层的Keep_Alive机制,通过这种机制及时变更CLIENT连接状态
      

  6.   

    完成端口获取套接字消息(GetQueuedCompletionStatus)时,0 == dwIoSize(但你本来的发送和接收的长度不为0)WSARecv的时候返回值SOCKET_ERROR,但ERROR_IO_PENDING != WSAGetLastError
    WSASend的时候返回值SOCKET_ERROR,但ERROR_IO_PENDING != WSAGetLastError
    这几个地方判断客户端是否已断开。
      

  7.   

    flashboy(爱写程序的小绵羊),你说得不对。客户端连接断开,iocp服务器端是知道的。你可以去找微软的iocp_standard例子再看看。