正确关闭Linux套接字的方法,Linux和Windows之间的区别?

don*_*e26 4 sockets linux flush

我正在执行套接字操作,因此丢失了套接字上的数据close()

特定于Linux的手册shutdown()页没有帮助:

shutdown()调用导致与sockfd关联的套接字上的全双工连接的全部或部分被关闭。如果SHUT_RD如何,将不允许进一步的接收。如果SHUT_WR如何,将不允许进一步的传输。如果SHUT_RDWR如何,将不允许进一步的接收和发送。

微软的MSDN更好,但是它是Windows特有的,它与Linux之间存在差异:

为确保所有数据在关闭之前在连接的套接字上发送和接收,应用程序应在调用closesocket之前使用shutdown关闭连接。等待通知远端已发送所有数据并启动正常断开连接的一种方法是使用WSAEventSelect函数,如下所示:

1. Call WSAEventSelect to register for FD_CLOSE notification.
2. Call shutdown with how=SD_SEND.
3. When FD_CLOSE received, call the recv or WSARecv until the function completes with success and indicates that zero bytes were received. If SOCKET_ERROR is returned, then the graceful disconnect is not possible.
4. Call closesocket.
Run Code Online (Sandbox Code Playgroud)

我的问题

  • 在Linux下,等待FD_CLOSE(步骤1)等效吗?

我得到的答案和评论认为我在询问Windows上的行为。我问的是Linux上的行为,我只是参考 Windows文档,因为它比Linux手册页更加清晰和完整。

Jos*_*sey 5

在我非常详细的答案中,遵循MSDN的建议,以解决close()未正确关闭套接字的问题。这基本上与雷米·勒博Remy Lebeau)在这里回答相同。