GetQueuedCompletionStatus блокирует навсегда

Я пишу серверное приложение и хочу использовать порты 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;
}

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); 
}

 void AcceptClientConnections (void * arg)
{
  SOCKET ClientSocket;
  КЛИЕНТЫ * с;

  _tprintf(_T("Начать прием клиентских подключений \n"));


  в то время как (истинно){  
    ClientSocket = принять (SrvSocket, NULL,NULL);

    если (ClientSocket==INVALID_SOCKET){
      _tprintf(_T("Невозможно принять соединение \n"));
      Продолжить;
    }

    /* сделать связь с портом завершения */
    c = (КЛИЕНТЫ *)malloc(sizeof(КЛИЕНТЫ));
    c->sock = ClientSocket;

    /* связать с портом завершения */
    if(!CreateIoCompletionPort((HANDLE)ClientSocket, hIocp,  (ULONG_PTR)c,0)){
      _tprintf(_T("Невозможно связать с портом завершения \n: %d"),GetLastError());

    }

  }
}

Любая идея? заранее спасибо.

2 ответа

Вы не используете порт завершения правильно, поэтому он не имеет ничего общего, и, следовательно, нет статуса для отчета. Использование порта завершения с сокетами - двухэтапный процесс, но вы делаете только половину шагов.

Прочитайте следующую статью MSDN для деталей:

Windows Sockets 2.0: создание масштабируемых приложений Winsock с использованием портов завершения

ОДНА возможность: проверьте, связал ли вы гнездо слушателя с портом завершения (сделал эту ошибку сам). Если у вас нет GetQueuedCompletionStatus(), он будет заблокирован навсегда.

Другие вопросы по тегам