套接字接收流在接收 FIN 数据包时是否会关闭

Does a socket receive stream get closed when it receives a FIN packet?

本文关键字:是否 FIN 套接字 数据包      更新时间:2023-10-16

我正在尝试弄清楚如何实现优雅的断开连接(4 向握手)。

首先,我使用以下代码发送一个FIN数据包:

shutdown(socket, SD_SEND);

这将导致发送套接字发送流关闭。现在,当另一端收到FIN数据包时,它也会发送它的FIN数据包:

shutdown(socket, SD_SEND);

我的问题是:接收FIN数据包是否会自动关闭套接字接收流,因此无需显式关闭它:

shutdown(socket, SD_RECEIVE);

让我们将您的问题分成几部分:

您声明:

首先,我使用以下代码发送 FIN 数据包:

shutdown(socket, SD_SEND)

这将导致发送套接字发送流关闭。现在当另一个 端接收 FIN 数据包,它还将发送它的 FIN 数据包:

第一:shutdown(socket}不会"关闭发送流"。它只是导致套接字不再接受send()调用。发送缓冲区仍然存在于套接字中,您只是无法在其中放入任何东西(因为您说您不会关闭)

第二:您是正确的,shutdown(socket, SD_SEND)应该导致套接字发送 FIN。您不正确,另一个套接字将发送 FIN 作为响应。您的套接字发送的 FIN 告诉另一个套接字您将不再发送数据。另一个套接字可能仍有要发送的数据。另一个套接字在没有要发送的数据时将发送 FIN。另一个套接字决定何时发送 FIN。

要回答您的实际问题:

接收 FIN 数据包不会自动"关闭套接字接收流",因为这不是实际可以完成的事情。套接字资源仅在调用closesocket(socket)时释放。即使在收到 FIN 后,您也可以继续拨打recv()电话。