windows Socket编程之EventSelect网络模型

本文介绍了Windows Socket编程中的EventSelect网络模型,该模型解决了select模型中等待数据到来时浪费CPU时钟周期的问题。通过使用网络事件对象,EventSelect能更高效地处理客户端的读写操作。在工作者线程中,使用WSAWaitForMultipleEvents函数检查事件,当读、写或关闭事件发生时采取相应操作。此外,文章还提及了异步选择模型作为另一种选择,但因其基于Windows消息,通常只适用于窗口程序,而EventSelect模型适用范围更广。
摘要由CSDN通过智能技术生成

前一篇文章我们讲了select网络模型,它解决了有N个客户端连接,就有N+1个线程的问题,现在我们只需要2个线程就能搞定了。但是,我们的服务端仅仅是这样的话,它的效率还是非常低的。在select模型中,我们在工作者线程里边调用了select函数来判断是否有数据到来了(有信号了),如果没有信号,select就会卡在这里,虽然我们可以给它一个超时时间,但是它在底层还是调用了sleep函数。所以它浪费了CPU的时钟周期,由于我们不知道客户是什么发送数据过来,可能是1秒,可能是1小时,也有可能是1天,所有等待数据到来占了非常大的一部分时间,效率是比较低的。接下来我们来看下EventSelect模型,它要解决的问题就是将这个等待数据到来的时间给节省掉了。

首先,初始化网络环境,创建一个监听的socket,然后进行bind,listen操作。接下来我们会创建一个网络事件对象,它和我们讲内核态下线程同步里边事件对象很类似,我们可以调用WSACreateEvent来创建它,其声明如下:

WSAEVENT  WSACreateEvent (void);

然后我们再调用WSAEventSelect,来将监听的socket与该事件进行一个关联,其声明如下:

int WSAEventSelect(  
  SOCKET s,                 //套接字
  WSAEVENT hEventObject,    //网络事件对象
  long lNetworkEvents       //需要关注的事件
);
因为我们这里是将监听的socket与事件对象进行关联,因此我们只需要关注两个事件,一个是客户端的连接,一个是socket关闭这两个事件。然后,我们可以创建一个工作者线程了。最后将我们监听的socket和我们创建的那个网络事件对象保存到各自的全局数组里边去。这时候我们的主线程就结束了。

然后我们来看下我们的工作者线程做了哪些工作。在工作者线程里边,会有一个死循环,在循环刚开始的时候,会调用WSAWaitForMultipleEvents函数,来查看我们那个全局事件对象数组里边是否至少有一个有信号到来,其声明如下:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值