繁体   English   中英

C LINUX \\ WINSOCK-检查发送中的FIN数据包

[英]C LINUX\WINSOCK- check FIN packet in Send

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

  1. 客户杀死了它的过程。 FIN消息发送到服务器。
  2. 服务器从客户端接收FIN消息。
  3. 服务器收到FIN消息后一毫秒,服务器使用发送消息,并将信息发送给客户端。

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

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

这个问题会定期出现。 简短的答案:操作系统中的TCP层不会故意将“确认”(确认收货)传递给应用程序层。 如果这样做的话,那将是您可以自在悬吊的绳索。 尽管TCP被认为是“可靠的”,但它实际上没有办法表明其上方的应用程序代码是否已实际处理了接收到的字节。

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

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

我不能说Linux,但是在Windows下,如果某个进程在建立的连接打开的情况下被杀死,则这些连接将被强制(硬)重置。 对等方将收到RST,而不是FIN,并且无法通过该连接进行进一步的通信。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM