我正在尝试弄清楚如何实现优雅的断开连接(4 次握手)。
首先,我使用以下代码发送一个 FIN
数据包:
shutdown(socket, SD_SEND);
这将导致发送套接字发送流被关闭。现在当对方收到 FIN
数据包时,它也会发送它的 FIN
数据包:
shutdown(socket, SD_SEND);
我的问题是:接收 FIN
数据包会自动关闭套接字接收流,因此无需显式关闭它:
shutdown(socket, SD_RECEIVE);
最佳答案
让我们把你的问题分成几个部分:
你说:
First I send a FIN packet using the following code:
shutdown(socket, SD_SEND)
This will cause the sending socket send stream to be closed. Now when the other side receives the FIN packet, it will also send it's FIN packet:
第一:shutdown(socket}
不会“关闭发送流”。它只是导致套接字不再接受 send()
调用。发送缓冲区仍然在套接字中,你不能在里面放任何东西(因为你说过你不会关闭)
第二:您是正确的,shutdown(socket, SD_SEND)
应该导致套接字发送 FIN。您认为另一个套接字将发送 FIN 作为响应是不正确的。您的套接字发送的 FIN 告诉另一个套接字您将不再发送数据。另一个套接字可能仍有它要发送的数据。当另一个套接字也没有数据要发送时,它会发送一个 FIN。另一个套接字决定何时发送 FIN。
回答您的实际问题:
接收 FIN 数据包不会自动“关闭套接字接收流”,因为这实际上无法完成。只有在调用 closesocket(socket)
时才会释放套接字资源。即使在收到 FIN 后,您也可以继续调用 recv()
。
关于c++ - 套接字接收流在接收到 FIN 数据包时是否关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28924568/