ric*_*ins 6 c macos networking
我试图在客户端避免TIME_WAIT.我连接然后设置O_NONBLOCK和SO_REUSEADDR.我调用read直到它返回0.当read返回0时,errno也是0.我将此解释为服务器关闭连接的标志.但是,如果我调用close,则套接字设置为TIME_WAIT,由netstat确认.
由于我与同一主机/端口建立了多个连接,因此我最终开始看到"使用中的地址"错误(请参阅http://hea-www.harvard.edu/~fine/Tech/addrinuse.html).
读取返回0后,我应该关闭吗?如果我不这样,文件描述符将被释放?
启动关闭连接的那一方是最终处于该TIME_WAIT状态的那一方. read()返回0应该表明服务器首先关闭了套接字,所以是的 - 这应该意味着TIME_WAIT服务器端的服务器结束,客户端通过LAST_ACK.
在一天结束时,你无法避免一个TIME_WAIT国家.即使您成功将其从客户端移动到服务器端,在结束之前仍然无法重复使用该(server host, server port, client host, client port)元组TIME_WAIT(无论它在哪一侧).
由于该元组的三个部分都固定在您的方案(server host,server port,client host),你真的只有这些选项:
尝试提供更多客户端端口.默认情况下,某些操作系统仅使用一小部分可用端口用于"临时端口"(在这方面我不确定OSX).如果是这种情况,请查看是否可以通过操作系统中的配置调整来更改范围,或者让应用程序在循环中使用bind()/ connect()循环搜索工作端口,直到连接正常工作.
client host通过在客户端上使用多个IP地址,扩展可用值的数量.但是,您必须bind()具体应用于其中一个IP地址.
通过在服务器上使用多个端口和/或IP地址,扩展可用的server host/ server port值数.客户端需要选择一个连接(循环,随机等).
可能是最好的选择,如果它是可行的:重构你的协议,以便完成的连接不会关闭,但进入"空闲"状态,以便以后可以重用它们,而不是打开一个新的连接(如HTTP)活着).