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操做, socket

      

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

    咱们主要看第二条消息, 和咱们的995错误是否是很相似,那么咱们就能够假设是由于投递的I/O操做返回引发的测试

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

相关文章
相关标签/搜索