我在试着避免在客户中使用TIME_WAIT。我连接然后设置O_NONBLOCK和SO_REUSEADDR。我调用read,直到它返回0。当read返回0时,errno也是0。我将其解释为服务器关闭了连接。但是,如果我调用close,套接字将被设置为TIME_WAIT,正如netstat所确认的那样。
由于我对同一主机/端口进行了多次连接,最终开始看到"Address in use“错误(请参阅http://hea-www.harvard.edu/~fine/Tech/addrinuse.html)。
我应该在read返回0后调用close吗?如果我不这样做,文件描述符会被释放吗?
发布于 2009-12-19 08:01:55
发起关闭连接的一端是最终处于TIME_WAIT状态的一端。返回0的read()应该表明服务器首先关闭了套接字,所以是的-这应该意味着TIME_WAIT结束在服务器端,客户端通过LAST_ACK。
归根结底,您无法避免TIME_WAIT状态。即使您成功地将它从客户端移动到服务器端,在TIME_WAIT结束之前,您仍然不能重用该(server host, server port, client host, client port)元组(无论它在哪一端)。
由于元组三个部分在您的场景中是固定的(server host、server port、client host),因此您实际上只有以下选项:
bind()/connect()搜索工作端口,直到连接works.client host值的数量,方法是在您的客户端上使用多个IP地址。通过使用服务器上的多个端口和/或IP地址,您必须让应用程序bind()到这些IP地址之一,特别是though.server host/server port值的数量。客户端将需要选择一个来连接(循环、随机、etc).发布于 2009-12-19 06:32:11
后来在同一页上,他们提到了SO_REUSEADDR。这就是你需要的。当读文件描述符返回零时,您肯定想要关闭它。
发布于 2013-05-14 04:18:48
除非还设置了SO_REUSEADDR,否则在客户端设置SO_REUSEADDR对服务器端没有任何帮助
https://stackoverflow.com/questions/1931043
复制相似问题