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());
}
}
}
Любая идея? заранее спасибо.
2011-10-18 20:50
2
ответа
Вы не используете порт завершения правильно, поэтому он не имеет ничего общего, и, следовательно, нет статуса для отчета. Использование порта завершения с сокетами - двухэтапный процесс, но вы делаете только половину шагов.
Прочитайте следующую статью MSDN для деталей:
Windows Sockets 2.0: создание масштабируемых приложений Winsock с использованием портов завершения
2011-10-18 23:59
ОДНА возможность: проверьте, связал ли вы гнездо слушателя с портом завершения (сделал эту ошибку сам). Если у вас нет GetQueuedCompletionStatus(), он будет заблокирован навсегда.
2014-09-27 16:04