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

问题描述 投票:0回答:1

我正在尝试在c中进行多人游戏,但是当我从服务器向客户端发送多个包“ARV 2 \ n \ 0”和“POS 2 0 0 \ n \ 0”时(使用send()) ,当我尝试用recv()读取它们时,他只找到1个看似是2个包的包。

所以我问,这是正常的吗?如果是的话,我怎么能强迫我的客户端逐一读取包裹? (或者我的服务器如果问题来自呼叫发送,则逐个发送它们)

谢谢 !

c sockets protocols multiplayer
1个回答
3
投票

简短回答:是的,这很正常。我假设你正在使用TCP / IP。它是字节流协议,没有“数据包”。任何一端的网络和操作系统都可以以适合某些缓冲区或网络部分的任何方式组合和拆分您发送的数据。唯一保证的是,您以相同的顺序获得相同的字节。

您需要使用自己的数据包框架。对于文本协议,使用例如'\0'字节或换行符分隔数据包。另请注意,网络或操作系统可能会为每个“读取”提供部分数据包,因此您还需要在代码中处理该数据包。如果数据包分隔符是单字节,这是最简单的。

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


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

© www.soinside.com 2019 - 2024. All rights reserved.