我有一个带有 GUI 的 C++ 应用程序(在 PC 1 上)就像网络游戏一样运行,并以相当固定的时间间隔通过 WiFi(临时的,因此非常可靠)从另一台计算机 (2) 接收数据包 (像 40 毫秒),每个程序循环一次(2)。我使用发送/读取。
问题来了:
- 数据包并不总是完全发送(但显然您可以简单地保持 send()
剩余数据,直到所有数据都发送完毕,这样效果很好)
- 更重要的是,在(1)的循环中,数据包被堆叠在套接字中,直到发生read()
,然后就无法区分大包中的数据包了数据流,或者知道您是否已经在数据包的中间。
我试图用 ID header 解决这个问题(你找到一个 ID 作为第一个字节,你知道数据包的长度),但我经常迷路(未知 ID:我们不在数据包的开头)并且我被迫忽略所有剩余的数据。
所以我的问题是:
为什么数据包会堆叠? (通常我有 400B 的数据,而我的数据包长度 <100B,fps (1) 和 (2) 差别不大)
我怎样才能有一个更可靠的方式来接收实际的数据包,比如 80% 的数据包(丢弃数据包丢失,这不是 UDP/TCP 的问题)?
用于接收数据包的单独线程是否可行? (关于(1),服务器)
实时网络游戏如何做到这一点(包括多客户端管理)?
提前致谢。
(对不起,我没有这里的代码,但我尽量说清楚了)
最佳答案
嗯:
1) UDP 传输消息,但不可靠。
2) TCP传输BYTE STREAMS,是可靠的。
UDP 无法可靠地传输消息。任何更可靠的东西都需要基于 UDP 的协议(protocol)。
TCP 无法传输只有一个字节长的消息。任何更复杂的东西都需要在 TCP 之上的协议(protocol)。
关于c++ - 在网络游戏中正确发送/接收数据的方法(UDP,但为什么不是 TCP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12093446/