C LINUX \ WINSOCK-检查发送

时间:2015-10-10 16:59:06

标签: c linux sockets winsock send

我试图了解如何避免以下情况:

  1. 客户终止其进程。 FIN消息将发送到服务器。
  2. 服务器从客户端收到FIN消息。
  3. 服务器收到FIN消息后的几毫秒,服务器使用发送消息,并向客户端发送信息。
  4. 使用C API-服务器能否知道客户端确认了哪些数据包?

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

2 个答案:

答案 0 :(得分:2)

这个问题会定期出现。简短回答:操作系统中的TCP层有意放弃"确认" (确认收到)到应用层。如果确实如此,那将是你自己上吊绳索。虽然TCP被认为是“可靠的”,但它实际上并没有办法表明它上面的应用程序代码是否实际处理接收到的字节。

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

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

答案 1 :(得分:0)

我不能代表Linux,但是在Windows下,如果一个进程在已建立的连接打开的情况下被终止,那么这些连接将被强制(硬)重置。对等体将接收RST,而不是FIN,并且无法通过连接进行进一步的通信。