Linux中的优雅关机服务器套接字

时间:2012-03-13 09:38:24

标签: c linux tcp

我希望能够停止监听linux中的服务器套接字,并确保从客户端的角度打开的所有连接都得到正确处理而不是突然关闭(即:接收ECONNRESET)。

即:

sock = create_socket();
listen(sock, non_zero_backlog);
graceful_close(sock);

如果认为调用close()并处理已经接受的套接字就足够了,但是如果你在服务器套接字上调用close(),那么在内核backlog中可能会打开连接,这些连接会突然关闭。

1 个答案:

答案 0 :(得分:5)

唯一可行的方法(我发现)是:

  1. 阻止accept()添加更多客户

  2. 在某个地方有一个打开的套接字列表,并等到它们全部正常关闭,这意味着:

    • 使用shutdown()告诉客户您将不再使用该套接字

    • 呼叫read()一段时间以确保所有客户端都已发送 同时被拉了

    • 然后使用close()释放每个客户端套接字。

  3. 那么,你可以放心地close()监听套接字。

  4. 您可以(并且应该)使用超时来确保空闲连接不会永远持续。