如何在不关闭套接字的情况下向主机发送 FIN 标志

Posted

技术标签:

【中文标题】如何在不关闭套接字的情况下向主机发送 FIN 标志【英文标题】:How to send FIN Flag to host without closing socket 【发布时间】:2015-02-04 19:08:01 【问题描述】:

我编写了一个创建套接字的 C 代码,到目前为止它工作正常。 在 TCP 的 RFC 中,我发现可以发送一个 FIN 标志来告诉其他主机我想退出或对话。 FIN 标志并不意味着其他主机无法发送更多数据。因此,在一个完美的世界中,我会发送 FIN 标志,而另一个主机知道我不想再说话了,他会发送其余的数据并在那之后关闭。 但是我怎样才能发送 FIN ??? close() 函数对我来说是这样做的,或者更好地设置 linux 内核在他存放资源时所做的事情。 但是收起资源意味着我不能再使用 recv() 函数,因为当我调用 close() 函数时,文件描述符被内核收起。 那么如何读取其他主机在我的 FIN 标志之后可能想要发送的其余数据。 我敢打赌有一个干净的解决方案

【问题讨论】:

【参考方案1】:

您想使用shutdown(s, SHUT_WR) 关闭套接字的写入端。

shutdown() 调用会导致全部或部分全双工连接 要关闭与 sockfd 关联的套接字。如果怎么样 SHUT_RD,将不允许进一步接收。如果SHUT_WR怎么样, 进一步的传输将被禁止。如果SHUT_RDWR怎么样, 进一步的接收和传输将被禁止。

另见:

close vs shutdown socket?

【讨论】:

以上是关于如何在不关闭套接字的情况下向主机发送 FIN 标志的主要内容,如果未能解决你的问题,请参考以下文章

如何让机器人在不使用命令的情况下向特定频道中的特定公会发送消息

如何在不打开 WhatsApp 的情况下向 WhatsApp 群组发送消息?

如何在不使用 Firebase 控制台的情况下向 iOS 设备发送 Firebase 云消息通知?

是否可以在不构建任何应用程序的情况下向 Android 发送推送通知?

如何在不知道标识符的情况下向聚合发送命令?

我开发了提醒应用程序,因此如何在不使用 firebase 的情况下向用户发送本地通知