linux - 套接字连接在关闭后仍会保持一段时间

标签 linux ubuntu tcp

各位,

我的环境是 Ubuntu 12.04。

这是我正在监听连接的 TCP 服务器应用程序的伪代码:

while(true) {
    int hConn = accept(hMain, NULL, NULL);

    string s = readClient(hConn);
    if (s == "quit") {
        close(hConn);
    }
 }

当我的服务器正在运行时,我在端口 nnnn 上远程登录到本地主机:

$ telnet localhost nnnn
quit
Connection closed by foreign host.
$

当服务器收到“退出”时,它会关闭客户端连接。这会导致 telnet 客户端退出并显示适当的消息。

到目前为止一切顺利。

但是,当我运行 netstat 时,我仍然可以看到客户端连接仍然存在。

连接消失需要几秒钟。

即使我强制退出我的服务器应用程序,也会发生这种情况。

如果我再次运行我的服务器应用程序,我会收到端口“nnnn”仍在使用中的错误消息。

我必须等待几秒钟才能再次运行我的服务器应用程序。

有什么我想念的吗?有没有办法解决此问题?

请注意,我确实在退出服务器时关闭了套接字 hMain,尽管这在上面的伪代码中没有显示。

预先感谢您的帮助。

问候,
彼得

最佳答案

您需要了解 TIME_WAIT 状态,该状态规定出于 TCP 安全/完整性原因,已关闭的 TCP 连接会停留几分钟。

可以通过 SO_REUSEADDR 选项解决重启服务器的问题。

关于linux - 套接字连接在关闭后仍会保持一段时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16911745/

相关文章:

c - 为什么我们不在 TCP 程序中使用客户端地址?

networking - TCP 是在每个数据包上发送 SYN/ACK 还是仅在第一个连接上发送?

ubuntu - 权限被拒绝(公钥、密码)。在使用 ssh 登录时

bash - 如何使用通配符将一个目录的所有内容移动到新目录?

linux - git pull & git clone hang - Linux Ubuntu

c# - 通过 TCP 在 C# 中发送数据包?

python - `numpy.random.normal` 在不同的系统上生成不同的数字

linux - 在 Ubuntu 11.10 中显示经典 View

c - 如何在 C 语言自己的 shell 中使用 bash shell 内置命令?

java - 我可以使用 java 策略文件通过 sudo 安全地运行不受信任的应用程序吗