C++ IOCP问题备注(955, 1236)

[1236错误] 情况如下: 1.client连接server
      2.client发送消息到server
      3.client使用closesocket(sock);
      4.server接收到关闭socket消息 (lpNumberOfBytesTransferred为0,  注意:如果客户端发送的是空消息同样为零) 然后使用closesocket函数关闭了这个客户端的socket
      5.这时候情况发生了,GetQueuedCompletionStatus函数返回false并且GetLastError() == 995 或者 1236

    原因如下: 经过本人测试发现, 如果不向系统投递这个客户端recv操作, 那么客户端使用closesocket函数服务端是无法接收到消息的, 那么说明closesocket对于服务端来说也是一个特殊的recv操作,
    但是投递了接收操作却会出现995或者1236错误,995错误的说明是中止I/O操作引起的,但是我们已经接收到了客户端的close消息, 所以才说closesocket是特殊的recv操作, 

      

      那么1236错误呢? 最开始我是在网络上查找这种错误说明,但是都没有太大的帮助, 直到我找到了一篇文章,上面是这样说的

    我们主要看第二条消息, 和我们的995错误是不是很类似,那么我们就可以假设是因为投递的I/O操作返回引起的

  解决方法:
    既然是因为I/O操作未完成引起的,那么我们何不让它完成,这样就从根源上解决了问题发生,经过本人测试, 我们只需要让客户端再发一次消息,然后服务端再关闭客户端的socket, 这时候既没有出现995错误,也没有1235错误, 完美解决。
    第二种方法: 如果是995错误我们可以使用PostQueuedCompletionStatus重新投递一次IO操作让我们的工作者线程活过来,但是这个方法对1236错误没用, 那么我们就只能重启工作者线程了。至此,问题解决

猜你喜欢

转载自www.cnblogs.com/muzzik/p/12624062.html
今日推荐