接收到FIN数据包时,套接字接收stream是否closures?

我想弄清楚如何实现一个优雅的断开(4方式握手)。

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

 shutdown(socket, SD_SEND); 

这将导致发送套接字发送stream被closures。 现在当对方接收到FIN数据包时,它也会发送它的FIN数据包:

 shutdown(socket, SD_SEND); 

我的问题是:接收到一个FIN数据包会自动closures套接字接收stream,所以不需要明确地closures它:

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