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
{
}
//注意释放事件对象
}