通過WSAEVENT事件替代socket多線程

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

{

}

//注意釋放事件對象

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章