一尘不染

Linux中的正常关机服务器套接字

linux

我希望能够停止在Linux中的服务器套接字上进行侦听,并确保正确处理了从客户端角度打开的所有连接,并且没有突然关闭它们(即:接收ECONNRESET)。

即:

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

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


阅读 212

收藏
2020-06-07

共1个答案

一尘不染

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

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

  2. 在某处有一个打开的套接字列表,然后等待它们完全正确关闭,这意味着:

    • 使用shutdown()告诉客户端,您将在插座上不再工作

    • read()稍等片刻,以确保与此同时已发送所有客户端

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

  3. 然后,您可以安全地close()监听套接字。

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

2020-06-07