socket編程的時候,爲了監控不同的socket,可能用到多線程的方式實現,但是在數據量不是特別大的時候,可以用WSAEVENT(handle)代替多線程
比如有sockArray數組,可以通過WSAEVENT wsEvent = WSACreateEvent()
產生和eventArray和sockArray對應,然後通過WSAEventSelect 綁定socke和event事件,綁定以後通過WSAWaitForMultipleEvents等待event,看到某個event
處於激發狀態時,通過WSAEnumNetworkEvents判斷該event的網絡事件類型,然後處理相應的事件類型。注意WSACreateEvent產生的事件都是手動的。
for (int i=0; i < socketArray.size(); i++)
{
if (SOCKET_ERROR == WSAEventSelect( socketArray[i],eventArray[i],FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE ))
{
//綁定失敗,相應處理}
}
while(!bQuit)
{
DWORD index = WSAWaitForMultipleEvents(vcEvent.size(),&*vcEvent.begin(),FALSE,INFINITE,FALSE);if (WSA_WAIT_TIMEOUT == index)
{
break;}
if (index >=(eventArray.size())
{
break;}
WSAResetEvent(eventArray[index]);//重置網絡事件
WSANETWORKEVENTS nev;
if ( SOCKET_ERROR != WSAEnumNetworkEvents(eventArray[index] eventArray[index],&nev) )
{
if (nev.lNetworkEvents & FD_CONNECT)
{
}
else if (nev.lNetworkEvents & FD_ACCEPT)
{
}
else if (nev.lNetworkEvents & FD_CLOSE)
{
}
else if (nev.lNetworkEvents & FD_WRITE)
{
}
else if (nev.lNetworkEvents & FD_READ)
{
}
else if (nev.lNetworkEvents & FD_OOB)
{
}
}
else
{
}
//注意釋放事件對象
}