c - 避免 TIME_WAIT

标签 c macos networking

我正在尝试避免客户端出现 TIME_WAIT。我连接然后设置 O_NONBLOCK 和 SO_REUSEADDR。我调用 read 直到它返回 0。当 read 返回 0 时,errno 也为 0。我将此解释为服务器关闭连接的标志。但是,如果我调用关闭,套接字将设置为 TIME_WAIT,这已由 netstat 确认。

由于我与同一个主机/端口建立了多个连接,我最终开始看到“地址正在使用”错误(请参阅 http://hea-www.harvard.edu/~fine/Tech/addrinuse.html)。

我应该在 read 返回 0 后调用 close 吗?如果我不这样做,文件描述符会被释放吗?

最佳答案

发起关闭连接的一方是最终出现在 TIME_WAIT 中的一方状态。 read()返回 0 应该表示服务器首先关闭了套接字,所以是的 - 这应该意味着 TIME_WAIT最终在服务器端,客户端通过 LAST_ACK .

归根结底,您无法避免 TIME_WAIT状态。即使您成功地将它从客户端移动到服务器端,您仍然无法重新使用 (server host, server port, client host, client port)元组直到 TIME_WAIT结束了(不管它在哪一边)。

由于该元组的三个部分在您的场景中是固定的(server hostserver portclient host),您实际上只有这些选项:

  • 尝试提供更多客户端端口。默认情况下,某些操作系统仅将一小部分可用端口用于“临时端口”(在这方面我不确定 OSX)。如果是这种情况,请查看您是否可以通过操作系统中的配置调整来更改范围,或者让应用程序使用 bind() 寻找工作端口。/connect()在一个循环中,直到连接正常。

  • 展开数量client host可用值,通过在您的客户端上使用多个 IP 地址。您必须拥有应用程序 bind()不过,具体到这些 IP 地址之一。

  • 展开数量server host/server port可用值,通过使用服务器上的多个端口和/或 IP 地址。客户端需要选择一个连接(循环、随机等)。

  • 可能是最好的选择,如果可行的话:重构您的协议(protocol),使已完成的连接不会关闭,而是进入“空闲”状态,以便以后可以重新使用它们,而不是打开它们一个新的连接(比如 HTTP keep-alive)。

关于c - 避免 TIME_WAIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50517381/

相关文章:

c - 如何使用c代码打开目录并将数据下载到其中

c# - 检测计算机上是否启用了链接层拓扑

macos - 在OSX上的tmux中配置鼠标

c - 提供指定 NIC、确定子网上 IP 的选项的最佳方式?

自己制作的 Linux 网桥 : arp request never succeeds

c - switch 中的多个 fork() 导致指数执行

c - 对自定义共享库的 undefined reference

c - 指向结构函数指针的函数指针

swift - 如何通过 NSUserUnixTask 传递参数,然后通过脚本访问?

python - 我无法为 python3 安装 anaconda