分类: LINUX
2009-07-17 20:19:56
1、为何要采用非阻塞的accept?
考虑如下情况,当客户在完成三次握手后,发送一个RST给服务端,如果RST到达服务端时,服务端还没有调用accept(这完全可能的,尤其在繁忙的服务器上,因为在select和accept之间完全可能还有其他代码,并且含有cpu的调度)。此时服务端TCP在收到RST后,源于berkeley的实现会在内核处理该事件,将该连接从已经建立好的连接队伍出删除,并不会通知服务端。而其他的实现则会返回ECONNABORTED或则EPROTO错误。考虑一个基于berkeley的系统,accept被调用,假定没有其他建立好的连接,此时accept被阻塞,srver被挂起,要一直到下一个连接到来才返回。