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

标签 c++ windows sockets tcp network-programming

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

相关文章:

linux - 函数指针指向 struct "proto_ops"的哪里?

c++ - 当调用 QTcpSocket::close() 时会发生什么?

c++ - 如何确保程序正在运行并在需要时重新启动它?

c++ - 我可以通过将函数实现为类对象方法来避免使用互斥锁吗

python - 在多个同步批处理文件完成后执行 1 个批处理文件

linux - 从 Windows 7 上的 Linux 虚拟框访问文件

c++ - 复制构造函数不识别继承的成员

c++ - 在通过 Visual C++ 应用程序执行的 msi 安装上指定 norestart

windows - 将文件夹中的文件名输出到文本文件

connect()在UDP客户端服务器中为C窗口中的IPv6地址提供错误