下面是IO完成端口工作线程中while( TRUE )里面的一段代码,但是在我WSASend以后,我
发现客户端接收到我发送出去的数据。本来这时应该再次跳进
GetQueuedCompletionStatus这个函数,但是,这段程序中却一直阻塞在
GetQueuedCompletionStatus函数这里,这是为什么呢?if (GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,
 (LPDWORD)&PerHandleData, (LPOVERLAPPED *) &PerIoData, INFINITE) == 0)
{
 DoLog("GetQueuedCompletionStatus failed with error %d", GetLastError());
 return 0;
}.......................PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->DataBuf.len = strlen(PerIoData->Buffer);if (WSASend(PerHandleData->Socket2, &(PerIoData->DataBuf), 1, &SendBytes, 0,&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
{
  if (WSAGetLastError() != ERROR_IO_PENDING)
  {
  DoLog("WSASend() failed with error %d\n", WSAGetLastError());
  return 0;
  }
}

解决方案 »

  1.   

    GetQueuedCompletionStatus函数本来就是阻塞的吧,而且是INFINITE
      

  2.   

    GetQueuedCompletionStatus是阻塞的,当I/O口完成操作后,会返回的。我的问题就是
    I/O口完成操作后,可能有什么原因使它不返回,仍然阻塞。
      

  3.   

    如果你已经投递了请求
    但还是收不到通知
    请检查在你投递请求之前有没有把PerIoData里面的OVERLAPPED结构置0
    没有的话试试先memset一下
      

  4.   


    我在调用WSASend之前对PerIoData->Overlapped进行了Zeromemory的操作。问题是这样解决的,但是问题解决了,不知道其中的道理:
    先前,我在调用WSASend时,直接把收到在PerIoData->Buffer的数据发出,结果出错了
    后来,我在调用WSASend前,先把PerIoData->Buffer的数据strcpy出来,再进行memset操作
    ,最后再把数据strcpy回PerIoData->Buffer,结果问题解决了。Why?