GetQueuedCompletionStatus永远阻止

时间:2011-10-18 20:50:56

标签: sockets io-completion-ports

我正在编写一个服务器应用程序,我想使用IOCompletion端口,所以我为服务器编写了一个原型,但是我遇到了GetQueuedCompletionStatus的问题,它永远不会返回(它阻塞)。以下是我的代码:

bool CreateSocketOverlappedServer()
{
  WSADATA wsaData;
  SOCKADDR_IN sockaddr;

  if(WSAStartup(MAKEWORD(2,2,),&wsaData)){
    _tprintf(_T("Unable to start up\n"));
    return false;
  }

  SrvSocket = WSASocket(AF_INET,SOCK_STREAM,0,NULL,NULL,WSA_FLAG_OVERLAPPED);
  if(SrvSocket==INVALID_SOCKET){
    _tprintf(_T("Unable to start socket\n"));
    return false;
  }

  sockaddr.sin_family = AF_INET;
  sockaddr.sin_port = htons(10000);
  sockaddr.sin_addr.s_addr = INADDR_ANY;

  /* now bind the socket */
  if(bind(SrvSocket, (SOCKADDR *)&sockaddr, sizeof(SOCKADDR_IN))==SOCKET_ERROR){
    _tprintf(_T("Unable to bind socket\n"));
    return false;
  }

  if(listen(SrvSocket, 5)==SOCKET_ERROR){
    _tprintf(_T("Error listening\n"));
    return false;
  }

  return true;
}

bool CreateSocketOverlappedServer() { WSADATA wsaData; SOCKADDR_IN sockaddr; if(WSAStartup(MAKEWORD(2,2,),&wsaData)){ _tprintf(_T("Unable to start up\n")); return false; } SrvSocket = WSASocket(AF_INET,SOCK_STREAM,0,NULL,NULL,WSA_FLAG_OVERLAPPED); if(SrvSocket==INVALID_SOCKET){ _tprintf(_T("Unable to start socket\n")); return false; } sockaddr.sin_family = AF_INET; sockaddr.sin_port = htons(10000); sockaddr.sin_addr.s_addr = INADDR_ANY; /* now bind the socket */ if(bind(SrvSocket, (SOCKADDR *)&sockaddr, sizeof(SOCKADDR_IN))==SOCKET_ERROR){ _tprintf(_T("Unable to bind socket\n")); return false; } if(listen(SrvSocket, 5)==SOCKET_ERROR){ _tprintf(_T("Error listening\n")); return false; } return true; }



void WorkerThread(void *arg)
{
   bool bret= false;
   DWORD dwTransferedBytes=0;
   CLIENTS *client;
   PPER_IO_OPERATION_DATA data;

   /* Just sleep for now */
   while(true){
     _tprintf(_T("Entering while\n"));
     bret = GetQueuedCompletionStatus(hIocp,&dwTransferedBytes,(PULONG_PTR)&client,(LPOVERLAPPED *) &data,INFINITE);
     if(!bret){
       _tprintf(_T("Unable to process completion port\n"));
     }
   }
   //Sleep(10000); 
}

有什么想法吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

您没有正确使用完成端口,因此它无关,因此无需报告状态。使用带套接字的完成端口是一个两步的过程,但您只执行了一半的步骤。

阅读以下MSDN文章了解详情:

Windows Sockets 2.0: Write Scalable Winsock Apps Using Completion Ports

答案 1 :(得分:1)

ONe可能性:检查是否已将侦听器套接字与完成端口关联(自己犯了这个错误)。如果你没有GetQueuedCompletionStatus()将永远阻止。