请问完成端口模型中,当工作线程调用GetQueuedCompletionStatus等待I/O事件完成
这个等待事件是不是只有在调用WSARecv或者WSASend后网络上有数据到来的时候这个等待才会返回
而单方面的只有网络上有数据到来但不调用WSARecv或者WSASend是不是就不会返回!

解决方案 »

  1.   

    我观察是的。
    还有AcceptEx投递了accept以后,如果有客户端连接的话也会有IO事件。
      

  2.   

    如果设定了超时也会返回详细的完成端口介绍可以看看《Windows核心编程》,里面有专门讲这个
      

  3.   

    也可以调用PostQueuedCompletionStatus函数来触发Get函数.
    The PostQueuedCompletionStatus function posts an I/O completion packet to an I/O completion port.
      

  4.   

    先把socket绑定到IOCP句柄上,然后调用WSARecv函数投递请求,WSARecv有数据到来的时候,GetQueuedCompletionStatus就回返回
      

  5.   

    http://www.wantsoft.com/article/27.htm
    看看完成端口的例子
      

  6.   

    网络io来说,ConnectEx,WSARecv,WSASend, AcceptEx,TransmitFile这几个函数完成都会被动触发工作线程,然后就是PostQueuedCompletionStatus能主动触发。
      

  7.   

    如果不在socket上投递请求wsarecv/wsasend/acceptex之类
    GetQueuedCompletionStatus就不会返回 除了超时
      

  8.   

    所以发生在与完成端口句柄做了关联的句柄上的支持Overlapped模式,并且有设置Overlapped结构的成功提交了的操作在完成(可能成功也可能失败)之后都可能会产生完成通知.