套接字设置非阻塞,可以对套件字设置非阻塞,这样就可以不必为等待一个套接字而整个程序(进程,线程)阻塞在那里,
设置了套接字不阻塞,则如果此套接字队数据还不可用,则任何阻塞函数调用之都会失败,并且返回一个EWOULDBLOCK
错误,每次出错了要判断一下是不是阻塞错误,如果是的话就忽略它,但是这种效率低下,
更好的办法是使用select()函数立即轮询许多套接字集,检测其中套接字是否有活动。
或者还有一种方法,就是使用多线程,每个线程接管一个连接connection,阻塞也是阻塞那个管理connection的线程,并不影响其它线程。
设置非阻塞:
|
|
select()函数本质是检查一组套接字集,如果其中有任何一个套接字有活动,它会告诉你。这样就不需要自己去检查每个套接字,以确定它是否获得
select()函数第一个参数是最大的套接字描述符编号。Winsock忽略这一参数,但是UNIX并不忽略此参数。
最笨的方法就是假设此值小于十六进制值0xFFFFFFF,它是int类型的最大值。
但是我看过一个简单的方法就是,利用套接字集中的最后一个套接字的描述符作为最大值,但是实际运用中发现这样并不能涵盖那个最大的描述符的套接字,所以我用最后一个套接字的描述符的值+1作为最大值,实际运用起来很好。
将套接字集的添加删除和select调用封装到一起:
|
|
实际运用select监听数据套接字:
|
|