在 C 中非常快速地发送多个包

Sending multiple Package very fast in C

我正在尝试用 c 编写多人游戏,但是当我从服务器向客户端发送 "ARV 2\n[=16=]" 和 "POS 2 0 0\n[=17=]" 等多个包时(使用 send()),当我尝试用 recv() 读取它们,他只发现 1 个包似乎是 1..

中的 2 个包

所以我想问一下,这正常吗?如果是,我怎么能强迫我的客户逐一阅读包裹? (如果问题来自调用发送,或者我的服务器将它们 1 个发送给他们)

谢谢!

简答:是的,这很正常。我假设您正在使用 TCP/IP。是字节流协议,没有"packets"。网络和两端的 OS 可能会以适合某些缓冲区或网络部分的任何方式组合和拆分您发送的数据。唯一可以保证的是,您会以相同的顺序获得相同的字节。

您需要使用自己的数据包框架。对于文本协议,使用例如 '[=10=]' 字节或换行符分隔数据包。另请注意,网络或 OS 可能会为您提供每个 "read" 的部分数据包,因此您也需要在代码中处理它。如果数据包分隔符是单字节,这是最简单的。

特别是对于没有 "unused" 字节值来标记数据包边界的二进制协议,您可以将数据包的长度写为二进制数据,然后是那么多数据字节,然后是长度、数据,等等在。请注意,即使在长度信息的中间,数据流也可能会拆分为不同的 "read" 调用(除非长度是单字节),因此您可能需要多几行代码来处理接收拆分数据包。


另一种选择是使用 UDP 协议,它确实会发送数据包。但是 UDP 数据包可能会丢失或以错误的顺序传递(还有一些其他问题),因此您需要以某种方式处理它,这通常会导致您重新发明 TCP,但效果不佳。所以除非你注意到 TCP/IP 不会削减它,否则坚持下去。