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(), он будет заблокирован навсегда.