IOCP中,发出一个WSARecv调用后,返回WSA_IO_PENDING。然后服务器端主动对这个连接执行closesocket,按照正常情况,这个WSARecv应该从GetQueuedCompletionStatus这里返回,可是有些时候就是不返回。有没有人遇到过?是什么原因引起的?只有偶尔不返回,不是所有的都不返回。

解决方案 »

  1.   

    调用返回WSA_IO_PENDING, 关闭后应该全部返回才对,我没遇到过这样的问题.
    是不是其它地方的问题?
      

  2.   

    会返回的,因为WSARecv执行后说明有一个“待决”的操作关于相应的SOCKET正在等待,如果SOCKET关闭了,那么待决操作应该是返回通知应用程序。
      

  3.   

    回复人: JJONY() ( ) 信誉:84  2005-03-13 20:54:00  得分: 0  
     
     
       会返回的,因为WSARecv执行后说明有一个“待决”的操作关于相应的SOCKET正在等待,如果SOCKET关闭了,那么待决操作应该是返回通知应用程序。  
     
    --------------------------------------------------
    就是这么奇怪,就是不返回。在closesocket后,原来的WSASend不返回。但是我接着在这个Socket上再次调用WSASend,调用失败,WSAGetLastError的值是10038,这说明系统已经知道了这个SOCKET关闭了,但是以前正在PENDING那个WSASend就是不从GetQueuedCompletionStatus这里返回,我也查看了,调用GetQueuedCompletionStatus的两个线程都正在GetQueuedCompletionStatus上阻塞着,但是就是不返回
      

  4.   

    先用PostQueuedCompletionStatus提交退出的操作.
    设置一个完成键标志.
      

  5.   

    回复人: blastzgd(边城浪子) ( ) 信誉:100  2005-03-14 09:47:00  得分: 0  
     
     
       先用PostQueuedCompletionStatus提交退出的操作.
    设置一个完成键标志.  
     
    -------------------------------------------------------------
    用PostQueuedCompletionStatus能导致不返回的那个WSASend从GetQueuedCompletionStatus这里返回?
      

  6.   

    如果你在IOCP线程里CLOSESOCKET是不会返回事件的,但是你在其他线程里就可以返回。