通过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

{

}

//注意释放事件对象

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值