Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 避免等待时间_C_Macos_Networking - Fatal编程技术网

C 避免等待时间

C 避免等待时间,c,macos,networking,C,Macos,Networking,我在尽量避免在客户那里等待的时间。我连接并设置O_NONBLOCK,然后重新使用EADDR。我调用read,直到它返回0。当read返回0时,errno也为0。我将此解释为服务器关闭连接的迹象。但是,如果我调用close,套接字将被设置为TIME\u WAIT,正如netstat所确认的那样 由于我对同一主机/端口进行了多次连接,我最终开始看到“地址正在使用”错误(请参阅) 我应该在读取返回0后调用close吗?如果我不这样做,文件描述符会被释放吗?稍后在他们提到的同一页上。这就是你需要的。 当

我在尽量避免在客户那里等待的时间。我连接并设置O_NONBLOCK,然后重新使用EADDR。我调用read,直到它返回0。当read返回0时,errno也为0。我将此解释为服务器关闭连接的迹象。但是,如果我调用close,套接字将被设置为TIME\u WAIT,正如netstat所确认的那样

由于我对同一主机/端口进行了多次连接,我最终开始看到“地址正在使用”错误(请参阅)


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

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

启动关闭连接的那一方就是最后处于
时间等待
状态的那一方
read()

在一天结束时,你无法避免时间等待状态。即使您成功地将它从客户端移动到服务器端,您仍然无法重复使用该
(服务器主机、服务器端口、客户端主机、客户端端口)
元组,直到
等待时间结束(无论它在哪一方)

由于该元组的三个部分在您的场景中是固定的(
服务器主机
服务器端口
客户端主机
),因此您实际上只有以下选项:

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

  • 通过在客户端上使用多个IP地址,扩展可用的
    客户端主机
    值的数量。不过,您必须将应用程序
    bind()
    专门绑定到这些IP地址之一

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

  • 如果可行的话,可能是最好的选择:重构协议,使完成的连接不会关闭,而是进入“空闲”状态,以便以后可以重复使用,而不是打开新连接(如HTTP保持活动)


    • 在客户端设置SO_REUSEADDR对服务器端没有帮助,除非它也设置SO_REUSEADDR

      对不起。我忘了加一句,我确实设置了。请参阅文章中的内容,当您连接到同一个端口/主机时,它不会阻止地址使用错误。很抱歉对一个旧问题进行评论,但此答案的第一段不应该是“启动关闭连接的那一方是最终处于TIME\u WAIT状态的那一方”吗?我似乎记得在某本书中读过这一点,而且,这似乎是sidenote中暗示的:当read返回0时,errno值未定义-errno仅在失败后定义。