投递一个WSARecv,携带一个overlapped对象ol。
有2个工作者线程,先后通过GetQueuedCompletionStatus得到这个ol。
这是为什么?一次投递不是只有一次post吗?

解决方案 »

  1.   

    投递一个WSARecv ,会触发一次GetQueuedCompletionStatus,可不一定就全部接收完了吧,未接收完的话还得继续投递WSARecv.
    对方关闭了连接也会触发一次GetQueuedCompletionStatus的
      

  2.   


    BOOL GetQueuedCompletionStatus(
      HANDLE CompletionPort,
      LPDWORD lpNumberOfBytes,
      PULONG_PTR lpCompletionKey,
      LPOVERLAPPED* lpOverlapped,
      DWORD dwMilliseconds
    );
    lpNumberOfBytes 
    [out] Pointer to a variable that receives the number of bytes transferred during an I/O operation that has completed. 
      

  3.   

    我是一个重叠对象ol只放于一次WSARecv中。WSARecv完成后销毁这个对象。下一次WSARecv放入新的重叠对象。
    照理一个ol只会被完成一次,被一个线程通过GetQueuedCompletionStatus收到。
    不解的是,为什么2个线程都会收到它?
      

  4.   

    如果你的同一个重叠对象ol投放在多个不同的socket上,是有可能出现这种情况的。