我想弄清楚如何实现一个优雅的断开(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()
。