Доброго времени суток!!!
У меня проблема с ассинхронными сокетами.
WaitForSingleObject реагирует только на FD_ACCEPT.
Можете подсказать что сделать?
Вот код
Код | SOCKET sockListen; sockaddr_in addrListen; WSAEVENT wsaEvent; WSANETWORKEVENTS wsaNWE;
int _tmain(int argc, _TCHAR* argv[]) { WSADATA wsaData; u_long iNonBlockMode = 1;
int iRet = WSAStartup(MAKEWORD(2, 2), &wsaData); if (iRet != 0) return -1; sockListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sockListen == INVALID_SOCKET) { WSACleanup(); return -1; } memset(&addrListen, 0, sizeof(addrListen)); addrListen.sin_addr.s_addr = INADDR_ANY; addrListen.sin_family = AF_INET; addrListen.sin_port = htons(9876); iRet = bind(sockListen, (struct sockaddr*)&addrListen, sizeof(addrListen)); wsaEvent = WSACreateEvent(); iRet = listen(sockListen, 5); iRet = ioctlsocket(sockListen, FIONBIO, &iNonBlockMode); iRet = WSAEventSelect(sockListen, wsaEvent, FD_ALL_EVENTS); DWORD waitRet = 0; bool bRunLoop = true; while (bRunLoop) { waitRet = WaitForSingleObject(wsaEvent, WSA_INFINITE); if (waitRet == WSA_WAIT_TIMEOUT) break; if (waitRet != WSA_WAIT_EVENT_0) break; WSAEnumNetworkEvents(sockListen, wsaEvent, &wsaNWE); switch (wsaNWE.lNetworkEvents) { case FD_ACCEPT: break; case FD_READ: break; case FD_CLOSE: bRunLoop = false; break; } WSAResetEvent(wsaEvent); } WSACloseEvent(wsaEvent); iNonBlockMode = 0; iRet = ioctlsocket(sockListen, FIONBIO, &iNonBlockMode); WSACleanup(); return 0; }
|
|