gpt4 book ai didi

c++ - 为什么需要 sleep(1) 来让 socket 耗尽?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:29:20 27 4
gpt4 key购买 nike

我下载了一个简单的静态网络服务器的源代码 http://www.ibm.com/developerworks/systems/library/es-nweb/sidefile1.html

但是,我对第 130 行感到困惑:

#ifdef LINUX
sleep(1); /* to allow socket to drain */
#endif

exit(1);

既然套接字没有关闭,是否意味着我需要等待客户端关闭套接字?

最佳答案

无论作者的意图如何,它都是不必要的不正确的exit() 就足够了。当在 TCP 套接字上调用 close() 或调用 exit() 终止进程时,除非设置了 SO_LINGER 套接字选项对于非默认设置,内核将使套接字保持等待状态并尝试传递任何未传递/缓冲的数据。您可以使用 netstat 看到这一点,这就是快速重启不是为快速重启而编写的 TCP 服务器将在快速重新打开端口时出现问题的原因(也有一种正确的方法可以实现这一点)。

我不同意接受的答案中的几件事。

close()exit() 应该对 socket 有相同的效果,传统上是否 close 只是风格问题code> 套接字,如果你正要退出

它应该与 TCP 发送缓冲区溢出无关,因为它发生在所有写入之后。满写缓冲区将通过write() 返回码立即返回错误;最后 sleep 与此无关。

sleep(1) 应该不会影响套接字缓冲区或可靠的数据传输。如果有的话,这段代码会在写入后限制 Web 服务器子进程,所以实际上没有什么好的效果,而且实际上可能会增加拒绝服务攻击的可能性。

我描述的是默认操作。可以通过许多选项更改默认值。

有关套接字编程的“圣经”,请参阅 W. Richard Steven 的 UNIX 网络编程 - 网络 API:套接字和 XTI,他在其中对此进行了详细介绍。

关于c++ - 为什么需要 sleep(1) 来让 socket 耗尽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26209126/

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