我希望能够停止在Linux中的服务器套接字上进行侦听,并确保正确处理了从客户端角度打开的所有连接,并且没有突然关闭它们(即:接收ECONNRESET)。
即:
sock = create_socket(); listen(sock, non_zero_backlog); graceful_close(sock);
如果认为调用close()并处理已经接受的套接字就足够了,但是可以在内核积压中打开一些连接,如果在服务器套接字上调用close(),这些连接将突然关闭。
唯一可行的方法(我发现)是:
阻止accept()添加更多客户端
accept()
在某处有一个打开的套接字列表,然后等待它们完全正确关闭,这意味着:
使用shutdown()告诉客户端,您将在插座上不再工作
shutdown()
请read()稍等片刻,以确保与此同时已发送所有客户端
read()
然后close()用于释放每个 客户端 套接字。
close()
然后,您可以安全地close()监听套接字。
您可以(并且应该)使用超时来确保空闲连接不会永远持续下去。