套接字接收流在收到FIN数据包时会被关闭吗?

时间:2015-03-08 08:37:10

标签: c++ windows sockets tcp network-programming

我正在试图弄清楚如何实现正常的断开连接(4次握手)。

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

shutdown(socket, SD_SEND);

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

shutdown(socket, SD_SEND);

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

shutdown(socket, SD_RECEIVE);

1 个答案:

答案 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()