非阻塞关闭 - 如何确保数据已发送

Non-blocking close - How to ensure data got send?

本文关键字:确保 数据 何确保      更新时间:2023-10-16

可能的重复项:
在 Linux 中发送空套接字的缓冲区?

我想创建一个套接字服务器,将一些数据发送到连接的客户端,然后再次断开他的连接。

我正在使用非阻塞套接字,所以我不知道如何确定所有数据是否至少被正确发送(发送?如果不再需要,我不想保持连接建立,因为我无法确保客户端自行断开连接。

目前我只是使用 shutdown() 和后来的 close() 关闭客户端。但是测试告诉我,客户端并不总是在连接关闭之前收到所有数据。

必须有一种方法可以确保在关闭非阻塞套接字上的连接之前发送所有数据,不是吗?希望我的问题足够清楚,你可以帮助我(:

在结束连接之前,您知道数据已发送的唯一方法是让对等方在应用程序协议中确认它。您可以通过在两端关闭输出,然后在两端读取 EOS,然后关闭两端的套接字来确保两端同时到达 EOS。

您可以在文件数据之前发送文件大小。关闭套接字时,只需检查文件大小并采取适当的操作来关闭或重新发送文件。