请问服务器端同时采用阻塞模型和WSAEventSelect模型可以不?
DWORD WINAPI _ServerListenThread(LPVOID lpParam)
{
CSrvManager *pSrv = (CSrvManager*)lpParam;
SOCKADDR ClientAddr;
int addr_length=sizeof(ClientAddr);
HANDLEhThread;
DWORDdwThreadId;
// Õâ¸ö½á¹¹ÓÃÀ´ÔÚLPARAM²ÎÊýÖд«µÝÐÅÏ¢µ½¿Í»§¶ËÏß³Ì
structmyStructmyStructure;
while(pSrv->bStopSrv)
{
SOCKET sockTemp = accept(pSrv->socketListen,(SOCKADDR*)&ClientAddr,&addr_length);
if(sockTemp == INVALID_SOCKET)
{
continue;
}
// ÉèÖô«µ½¿Í»§¶ËÏ̵߳ÄÐÅÏ¢µÄÊý¾Ý½á¹¹
myStructure.Socket = sockTemp;
myStructure.hWnd = hServerWnd;
// Ϊÿһ¸ö¿Í»§¶Ë´´½¨Ò»¸öÏß³Ì
hThread = CreateThread(NULL,0,ClientThread,(LPVOID)&myStructure,0,&dwThreadId);---采用阻塞模型
if (hThread)
{
//¹Ø±ÕÏ߳̾ä±ú
CloseHandle(hThread);
}
pSrv->AddSocket(sockTemp);=======》这个是采用WSAEventSelect模型
}
return 0;
}
[解决办法]
一个SOCKET同时不可能又是阻塞又是非阻塞
The WSAEventSelect function automatically sets socket s to nonblocking mode, regardless of the value of lNetworkEvents. To set socket s back to blocking mode, it is first necessary to clear the event record associated with socket s via a call to WSAEventSelect with lNetworkEvents set to zero and the hEventObject parameter set to NULL. You can then call ioctlsocket or WSAIoctl to set the socket back to blocking mode.
WASEventSelect可以由先前的非阻塞变成为阻塞,
int WSAEventSelect(
__in SOCKET s,
__in WSAEVENT hEventObject,
__in long lNetworkEvents
);
hEventObject设置为NULL,lNetworkEvents设置为0
[解决办法]