日期:2014-05-16  浏览次数:20605 次

为什么要不套接字设置成为非阻塞模式
为什么要把套接字设置为非阻塞模式?
与阻塞模式比较,非阻塞模式有什么优势?
什么情况下用非阻塞模式?

套接字设置非阻塞方法:
一种是:通过fcntl(fd, F_SETFL, NOBLOCK)加select;
第二种:直接是select();

请各个大侠指教!!!

------解决方案--------------------
要解释得说一堆的话。

《Unix网络编程》第一卷,第六章,IO复用。自己去看一遍。
------解决方案--------------------
第六章只讲了区别,看16章,非阻塞可以减少壁钟问题,书上说的,貌似很少用。
------解决方案--------------------
select与阻不阻塞没有关系,它不会修改套接字的属性的;
在阻塞状态下,某些时候,用select poll epoll仍然不能解决阻塞的问题,此时就需要设置为非阻塞,比如:
你要写的时候,select告诉你可写,但由于你写得太多,所以仍然可能阻塞;
你用epoll在ET模式下时,必须设置为非阻塞,因为你要读取完所有的数据,epoll_wait才会再次触发,此时一般用非阻塞模式,一直读到出错为止。

当然,似乎是有些函数,可以知道某个套接字现在读写缓存里面有多少数据,有多大的剩余,但我从来没用过,这显然会损失效率的。
------解决方案--------------------
阻塞程序就停止在那里了当然不好啊,非阻塞可以可以马上返回做别的事。
select方法效率太低了,要一直去监视有没有事件到来很耗时间。
其它方法很多,最有效的是完成端口模型。我的博客有简单的介绍可以看看。
------解决方案--------------------
这个问题其实问的很不错,未解决这样的问题,正像二楼所说,要说清楚,得一大堆,因此,你可以看一下5中IO模式,完成端口作为重点查看。高性能服务器的网络通信都是用非阻塞模式。这里面涉及到的东西也很多。涵盖了多线程、线程池、线程同步和数据互斥等。正式网络传输的精华所在。