slelect机制

来源:互联网 发布:网络投资平台那个好 编辑:程序博客网 时间:2024/05/16 12:47

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

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

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

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

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

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




0 0
原创粉丝点击