gpt4 book ai didi

c - 避免 TIME_WAIT

转载 作者:太空狗 更新时间:2023-10-29 17:22:33 28 4
gpt4 key购买 nike

我正在尝试避免客户端出现 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/1931043/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com