GetQueuedCompletionStatus блокирует навсегда - PullRequest
2 голосов
/ 19 октября 2011

Я пишу серверное приложение и хочу использовать порты IOCompletion, поэтому я написал прототип для сервера, но столкнулся с проблемой с GetQueuedCompletionStatus, которая никогда не возвращается (блокируется).Ниже мой код: </p> <pre><code>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; }

</p> <pre><code>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;
  CLIENTS *c;

  _tprintf(_T("Start accepting client connections\n"));


  while(true){  
    ClientSocket = accept(SrvSocket, NULL,NULL);

    if(ClientSocket==INVALID_SOCKET){
      _tprintf(_T("Unable to accept connection\n"));
      continue;
    }

    /* do an association with completion port */
    c = (CLIENTS *)malloc(sizeof(CLIENTS));
    c->sock = ClientSocket;

    /* associate with completion port */
    if(!CreateIoCompletionPort((HANDLE)ClientSocket, hIocp,  (ULONG_PTR)c,0)){
      _tprintf(_T("Unable to associate with completion port\n: %d"),GetLastError());

    }

  }
}
</code>

Есть идеи?заранее спасибо.

Ответы [ 2 ]

1 голос
/ 27 сентября 2014

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

1 голос
/ 19 октября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...