c/c++里面的socket事件开发

我们在进行socket开发的时候,一定会遇到这样的问题——就是一端如何才能高效的监听另一端发来的消息。当然了,最笨的方法是开一个线程,不断的循环去调用recv。但是这样做的效率太低了。解决这个问题的办法当然是使用event消息了。
先举个例子,比如client端连接到server端之后,除了向server发送数据之外,还要能够响应server发来的数据。但是client并不知道server什么时候会发送数据,也不知道发送的是什么数据。这里就需要用到消息事件了。下面我一步一步介绍实现的思路:

1、首先要有一个非堵塞的socket,不过这个一版不是问题(后面会说明)
2、然后是告诉系统我需要处理哪些event。因为系统会产生的event非常多,所以要进行一下说明,告诉系统我都需要哪些个event。
3、然后就是起一个线程去循环从消息池里面摘取event,然后进行处理就可以啦。
下面是实现的思路(代码copy不方便,反正有了思路就等于有了代码啦) 实例化一个socket之后,先进行connect,然后才能调用WSAEventSelect进行消息的声明(也就是告诉系统我都需要处理哪些消息),否则会出错滴!。记得调用WSAEventSelect之前要调用WSACreateEvent来创建一个WSAEVENT,作为WSAEventSelect的参数。
这里要说明的是,调用WSAEventSelect会自动的把socket模式变成非堵塞的(系统初始化的时候默认的是堵塞的),所以可以不用显示的去修改socket的模式啦。
到这里,系统就已经知道我们要处理哪些消息了。但是我们怎么去处理它呢?呵呵,首先开一个线程吧,这样比较好。然后在这个线程里面循环调用WSAEnumNetworkEvents,这个方法的第3个参数,WSANetworkEvent,是一个out型的参数,也就是我们要获得的消息啦。它有一个lNetworkEvents成员,它就是我们需要的消息啦。例如我们要处理read消息,就可以这样:
if(wsanetworkevent.lNetworkEvents == FD_READ) ......
好了,这次就写到这里。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值