我正在试图弄清楚如何实现正常的断开连接(4次握手)。
首先,我使用以下代码发送FIN
数据包:
shutdown(socket, SD_SEND);
这将导致发送套接字发送流关闭。现在,当另一方收到FIN
数据包时,它也会发送它的FIN
数据包:
shutdown(socket, SD_SEND);
我的问题是:收到FIN
数据包是否会自动关闭套接字接收流,因此无需明确关闭它:
shutdown(socket, SD_RECEIVE);
答案 0 :(得分:1)
让我们分一些问题:
你说:
首先,我使用以下代码发送FIN数据包:
shutdown(socket, SD_SEND)
这将导致发送套接字发送流关闭。现在当另一个 side接收FIN数据包,它也会发送它的FIN数据包:
首先:shutdown(socket}
没有“关闭发送流”。它只会导致套接字不再接受send()
次呼叫。发送缓冲区仍然在套接字中,你只是不能放入任何东西(因为你说你不会关机)
第二:你是正确的shutdown(socket, SD_SEND)
应该导致套接字发送FIN。你不正确,另一个套接字将发送一个FIN作为响应。您的套接字发送的FIN告诉另一个套接字您将不再发送数据。另一个套接字可能仍然有它想要发送的数据。当另一个套接字也没有要发送的数据时,它将发送FIN。另一个套接字决定何时发送FIN。
回答你的实际问题:
接收FIN数据包不会自动“关闭套接字接收流”,因为这不是实际可以完成的事情。仅在调用closesocket(socket)
时释放套接字资源。即使收到FIN,您仍可以继续致电recv()
。