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

ben*_*phy 11 c linux tcp

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

即:

sock = create_socket();
listen(sock, non_zero_backlog);
graceful_close(sock);
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*Gil 6

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

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

  2. 有一个打开的套接字列表,并等待它们都正确关闭,这意味着:

    • 使用shutdown()告诉客户,你将不再是那个插座上工作

    • read()了一会儿,以确保所有的客户在此期间,先后派出一直拉到

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

  3. 那么,你可以安全地close()听听插座.

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