slelect机制

之前也用过socket,但是遇到下面的问题时,我通常都是用多线程的方法解决:

程序的作用是循环的处理数据,但是对方给你发的数据的多少你却不清楚。

我之前的做法是开一个线程,作为收数据的线程,每次把数据放入缓冲队列中,在主线程中的循环处理时,每次从缓冲区中读取数据,然后处理。

这样做的原因是socket中的recv函数是阻塞的,即如果对方没有发数据,这个函数就会一直死等在这里。为了保证程序不受对方是否发数据影响,可以通过两个线程来解决。但是多线程无形之中对操作系统提出了要求,有没有办法直接解决呢?

最基本的想法,就是假设recv函数如果有1个机制,如果死等某个时间长度但是还是没有收到数据,就能返回该多好啊!很可惜,没有,但是利用select却能实现这个功能。具体参数怎么用大家查查MSDN就行了,这里只介绍基本原理:在每次send或者recv之前调用select函数,通过返回值判断当前有几个链接可读或者可写。然后遍历链接,每次通过FD_ISSET判断是否这个socket是否在读集或者写集中,如果是,在调用send或者recv发送或者接收数据。

可以点需要注意,send函数本身并不是阻塞的,这里为什么还要判断是否可以发送呢?因为如果链接尚未建立,此时send就会错误,所以可以用select判断一下。




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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值