首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免TIME_WAIT

避免TIME_WAIT
EN

Stack Overflow用户
提问于 2009-12-19 06:27:37
回答 3查看 10.1K关注 0票数 7

我在试着避免在客户中使用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吗?如果我不这样做,文件描述符会被释放吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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 hostserver portclient host),因此您实际上只有以下选项:

  • 尝试使更多客户端端口可用。默认情况下,一些操作系统只使用一小部分可用端口作为“临时端口”(在这一点上,我对OSX并不确定)。如果是这样的话,看看您是否可以通过在操作系统中调整配置来更改范围,或者让应用程序在循环中使用bind()/connect()搜索工作端口,直到连接works.
  • Expand到可用的client host值的数量,方法是在您的客户端上使用多个IP地址。通过使用服务器上的多个端口和/或IP地址,您必须让应用程序bind()到这些IP地址之一,特别是though.
  • Expand可用的server host/server port值的数量。客户端将需要选择一个来连接(循环、随机、etc).
  • Probably如果可行的话,这是最好的选择:重构您的协议,使已完成的连接不会关闭,而是进入“空闲”状态,以便稍后可以重用,而不是打开新的连接(如HTTP keep-alive).
票数 7
EN

Stack Overflow用户

发布于 2009-12-19 06:32:11

后来在同一页上,他们提到了SO_REUSEADDR。这就是你需要的。当读文件描述符返回零时,您肯定想要关闭它。

票数 1
EN

Stack Overflow用户

发布于 2013-05-14 04:18:48

除非还设置了SO_REUSEADDR,否则在客户端设置SO_REUSEADDR对服务器端没有任何帮助

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1931043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档