为什么需要睡觉(1)让插座漏掉?

gga*_*ngg 5 c c++ sockets

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

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

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

exit(1);
Run Code Online (Sandbox Code Playgroud)

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

cod*_*eim 5

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

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

close()并且exit()应该对套接字具有相同的效果,传统上,close如果您要使用套接字,则是否使用套接字只是风格问题exit

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

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

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

有关套接字编程的“圣经”,请参阅 W. Richard Steven 的UNIX 网络编程 - 网络 API:套接字和 XTI,他详细介绍了这一点。