C 避免等待时间
我在尽量避免在客户那里等待的时间。我连接并设置O_NONBLOCK,然后重新使用EADDR。我调用read,直到它返回0。当read返回0时,errno也为0。我将此解释为服务器关闭连接的迹象。但是,如果我调用close,套接字将被设置为TIME\u WAIT,正如netstat所确认的那样 由于我对同一主机/端口进行了多次连接,我最终开始看到“地址正在使用”错误(请参阅)C 避免等待时间,c,macos,networking,C,Macos,Networking,我在尽量避免在客户那里等待的时间。我连接并设置O_NONBLOCK,然后重新使用EADDR。我调用read,直到它返回0。当read返回0时,errno也为0。我将此解释为服务器关闭连接的迹象。但是,如果我调用close,套接字将被设置为TIME\u WAIT,正如netstat所确认的那样 由于我对同一主机/端口进行了多次连接,我最终开始看到“地址正在使用”错误(请参阅) 我应该在读取返回0后调用close吗?如果我不这样做,文件描述符会被释放吗?稍后在他们提到的同一页上。这就是你需要的。 当
我应该在读取返回0后调用close吗?如果我不这样做,文件描述符会被释放吗?稍后在他们提到的同一页上。这就是你需要的。
当读取文件描述符返回零时,您肯定要关闭它。启动关闭连接的那一方就是最后处于
时间等待
状态的那一方read()
在一天结束时,你无法避免时间等待状态。即使您成功地将它从客户端移动到服务器端,您仍然无法重复使用该(服务器主机、服务器端口、客户端主机、客户端端口)
元组,直到等待时间结束(无论它在哪一方)
由于该元组的三个部分在您的场景中是固定的(服务器主机
,服务器端口
,客户端主机
),因此您实际上只有以下选项:
- 尝试提供更多的客户端端口。在默认情况下,一些操作系统只为“临时端口”使用一小部分可用端口(在这方面,我不确定OSX)。如果是这种情况,请查看是否可以通过在操作系统中进行配置调整来更改范围,或者让应用程序使用
bind()
/connect()
在循环中查找工作端口,直到连接工作为止
- 通过在客户端上使用多个IP地址,扩展可用的
客户端主机值的数量。不过,您必须将应用程序bind()
专门绑定到这些IP地址之一
- 通过使用服务器上的多个端口和/或IP地址,扩展可用的
服务器主机
/服务器端口
值的数量。客户端需要选择一个连接(循环、随机等)
- 如果可行的话,可能是最好的选择:重构协议,使完成的连接不会关闭,而是进入“空闲”状态,以便以后可以重复使用,而不是打开新连接(如HTTP保持活动)
在客户端设置SO_REUSEADDR对服务器端没有帮助,除非它也设置SO_REUSEADDR对不起。我忘了加一句,我确实设置了。请参阅文章中的内容,当您连接到同一个端口/主机时,它不会阻止地址使用错误。很抱歉对一个旧问题进行评论,但此答案的第一段不应该是“启动关闭连接的那一方是最终处于TIME\u WAIT状态的那一方”吗?我似乎记得在某本书中读过这一点,而且,这似乎是sidenote中暗示的:当read返回0时,errno值未定义-errno仅在失败后定义。