C LINUX\WINSOCK-检查Send中的FIN包

C LINUX\WINSOCK- check FIN packet in Send

我正在尝试了解如何避免以下情况:

  1. 客户端终止了它的进程。 FIN 消息被发送到服务器。
  2. 服务器收到客户端的FIN报文。
  3. 服务器收到FIN报文后的一个毫秒,服务器使用send报文,向客户端发送信息。

使用C API-服务器可以知道客户端确认了哪些数据包吗?

如果是 - Linux\Winsock 中的命令是什么?

我不能代表 Linux,但在 Windows 下,如果进程在已建立的连接打开时被终止,这些连接将被强制(硬)重置。对等方将收到 RST,而不是 FIN,并且不可能通过连接进一步通信。

这个问题会定期出现。简短回答:OS 中的 TCP 层有意 将 "acks"(接收确认)传递给应用层。如果是这样,那将是您吊死自己的绳索。虽然 TCP 被认为是 "reliable",但它实际上没有办法表明它上面的应用程序代码是否确实 处理了 接收到的字节。

您提到了 "packets",但这是一个非常含糊的术语。您的套接字应用程序可能有 "messages" (不是数据包)的概念,但 TCP 没有数据包甚至消息的概念。它发送源自您的应用程序代码的字节 "streams"。 TCP 分段、IP 分段和其他因素会在网络上将您的消息分成多个数据包。并且 TCP 不知道哪些 IP 数据包构成了整个应用程序消息。 (常见的套接字谬误 - 许多开发人员错误地认为 "send" 对应另一侧相同大小的 "recv"。

因此,唯一可以确认成功接收消息的代码是套接字应用程序本身。换句话说,您的 client/server 协议应该有自己的确认系统。