WSAEventSelect ?解决办法
WSAEventSelect ?
为什么我写的这段代码只能接受两次客户端的连接啊。在往后就接收不到连接。WSAWaitForMultipleEvents()就永远返回TIMEOUT了。
------解决方案--------------------
WSAEnumNetworkEvents本身会重置这个事件对象的状态,你后面不需要调用WSAResetEvent
------解决方案--------------------
猜测,这不是WSAEventSelect的问题,可以尝试把焦点转向别的地方。
如果楼主调用GetQueuedCompletionStatus或者循环的异步接收却总是超时然后被WSAWaitForMultipleEvents逮到,结果就无限timeout了,典型的对一个关闭的套接字循环调用WSARecv就会出现这种情况。
纯猜测。。。
为什么我写的这段代码只能接受两次客户端的连接啊。在往后就接收不到连接。WSAWaitForMultipleEvents()就永远返回TIMEOUT了。
- C/C++ code
WSAEVENT acceptEvent = WSACreateEvent(); //事件对象句柄 SOCKET* server = serSocket->getSocket();//事件对象注册在的socket if(server == NULL) { cout<<"监听线程启动有错误"<<endl; return -1; } WSAEventSelect(*server,acceptEvent,FD_ACCEPT|FD_CLOSE);//事件对象关心的事件类型 //cout<<"the connectionOpenThread is running"<<endl; logger->log("ConnectionOpenThread is running."); WSAEVENT events[1] = {acceptEvent}; while(m_runningthread) { DWORD ret; ret = ::WSAWaitForMultipleEvents(1, &events[0], FALSE, 100, FALSE); if(ret == WSA_WAIT_FAILED || ret == WSA_WAIT_TIMEOUT) { continue; } cout<<"a network event"<<endl; //测试 WSANETWORKEVENTS ne;//网络事件 WSAEnumNetworkEvents(*server,acceptEvent,&ne); //查询什么网络事件发生了,WSAEnumNetworkEvents函数会自动重置受信事 if (ne.lNetworkEvents&FD_ACCEPT) { //为这个客户端建立一个套接字用来收发数据。 logger->log("a client connect."); cout<<"a client connect"<<endl; SOCKADDR_IN clientAddr; int addrlen = sizeof(sockaddr); SOCKET sClient = ::accept(*server, (sockaddr*)&clientAddr, &addrlen); //send(sClient,"server",7,0);//SOCKET可以使用 TCPSocket tempTcpsocket; tempTcpsocket.setSocket(sClient); SocketIO socketio; socketio.setTCPSocket(&tempTcpsocket); //********************************************************* //TCPSocket* test = socketio.getTCPSocket(); //SOCKET* t = test->getSocket(); //send(*t,"server",7,0);//SOCKET 可以使用 //************************************************************ IOService ios ; ios.setSocketIO(&socketio); //***************************************************** //SOCKET* soc = ios.getSocket(); //send(*soc,"server",7,0);///ok //**************************************************** SocketThread::addSocketService(&ios); WSAResetEvent(acceptEvent); } } cout<<"connectionOPenThread was closed"<<endl; ReleaseMutex(hmutex); this->Stop(); return -1; }
------解决方案--------------------
WSAEnumNetworkEvents本身会重置这个事件对象的状态,你后面不需要调用WSAResetEvent
------解决方案--------------------
猜测,这不是WSAEventSelect的问题,可以尝试把焦点转向别的地方。
如果楼主调用GetQueuedCompletionStatus或者循环的异步接收却总是超时然后被WSAWaitForMultipleEvents逮到,结果就无限timeout了,典型的对一个关闭的套接字循环调用WSARecv就会出现这种情况。
纯猜测。。。