1

伙计们,

我的环境是 Ubuntu 12.04。

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

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

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

当我的服务器运行时,我在端口 nnnn 上 telnet 到 localhost:

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

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

到目前为止,一切都很好。

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

连接消失需要几秒钟。

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

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

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

有什么我想念的吗?有没有办法解决这种行为?

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

预先感谢您的帮助。

问候,
彼得

4

1 回答 1

0

您需要了解TIME_WAIT状态,该状态提供了出于 TCP 安全/完整性原因而关闭的 TCP 连接会挂起几分钟。

可以通过该SO_REUSEADDR选项克服重新启动服务器的问题。

于 2013-06-04T10:13:17.317 回答