gpt4 book ai didi

c++ - 套接字接收流在接收到 FIN 数据包时是否关闭?

转载 作者:可可西里 更新时间:2023-11-01 02:42:40 26 4
gpt4 key购买 nike

我正在尝试弄清楚如何实现优雅的断开连接(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com