使用SFML验证实时网络上发送的数据包
Verifying sent packets on real time network using SFML
我正在构建一个可联网的程序,该程序使用SFML UDP库在2D屏幕上传输图形更改。
我想在主机服务器上运行几乎所有的处理,并且只向客户端发送图形更新和命令返回值。
我想在数据发送到连接两侧的屏幕之前,先设置一个验证条件。我正在考虑将单个字节发送为0或1,以表示成功接收数据并进行同步。
(见图)
Server-------( updates )----->Client
| |
( wait for )<---( 1 or 0 )-----Send Byte
| |
( if 1 ) ( if byte received )
| |
Screen Screen
在更新屏幕之前,来回ping以确保数据在两端都得到了验证,然后运行同一事物的另一次迭代(当然是无限期的),这似乎是合乎逻辑的。
我的问题是,使用SFML,发送1/0是否有意义,或者它会自己验证,即在发送数据时使用返回值?
此外,在网络上发送这一个字节比做其他事情(比如尝试与时间同步)慢吗?有没有更好的方法来实现FPS?
SFML方面的答案可能是最好的。
如果要用UDP模拟TCP,为什么不使用TCP
如果你坚持使用UDP,因为性能可能很关键(即使你认为性能很关键,TCP也可能会完成这项工作),你的客户端应该发送命令/更改/数据,只对接收到的数据做出反应,永远不要麻烦发送回布尔值(或单个位),因为有更好的方法来处理这个问题,而且这是对整个数据包的巨大浪费。
简单的方法
- 如果客户端从未收到请求的特定返回值,只需在给定的时间阈值后将请求重新发送到服务器,并抱着最好的希望
- 如果客户端没有任何更改,服务器也没有任何内容,只需重新绘制屏幕(或等待客户端更改)
- 如果在一个或多个重新发送请求后服务器没有任何消息,请将问题通知客户端(连接丢失或服务器错误)
在我所描述的中,服务器只需要响应客户端的请求一次,然后就忘记了
- 如果服务器从未接收到请求(因此从未响应客户端),客户端无论如何都会发回请求
- 如果服务器和客户端之间的服务器响应丢失,客户端将在时间阈值之后再次将其请求发送回服务器
很难为您提供正确的解决方案,因为我们缺乏有关您试图实现的项目的信息。
但我们可以说这是一场游戏。
如果这是一个游戏,简单的方法是
在游戏中,你不会信任客户端,所以玩家所做的每一个命令都会发送到服务器。服务器处理命令,进行所有计算,并在整个游戏中跟踪所有玩家。
然后,服务器将新位置返回给客户端。客户端只显示来自服务器的更改。例如,客户端从不在键盘输入上移动播放器。输入只需按原样发送到服务器,客户端从服务器接收新位置,移动指定的图形,然后渲染到屏幕上。
就是这样。
真实世界的方式
事实上,真实世界的游戏客户端处理输入,他们试图在向服务器发送请求之前/期间插入更改,然后根据接收到的数据进行调整。这给人一种没有滞后的错觉,即使网络通信不可避免地会延迟。延迟仍然存在,因为数据包在连接不良或间歇性延迟时丢失,但插值仍然有帮助。
这样,您仍然不信任客户端,您只是在服务器响应之前进行猜测。
那么,有了这些,TCP还是UDP
这些策略与协议无关,因为你自己处理问题。
UDP
如果你要发送大量只与发送时间相关的数据,UDP就会完成这项工作。想想视频会议或语音聊天,当你丢失一个数据包时,已经太晚了,无法将其发送回来。
TCP
如果你要发送适量的信息,比如每秒只发送60次位置,那么接收顺序可能比带宽或延迟更重要,所以TCP可能是最好的选择。
不要重复你自己
如果你要有一个单独的服务器应用程序,不要让它也显示在屏幕上,只需在服务器机器上运行另一个客户端,通过localhost连接即可。
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 数据包访问实践
- 在C++中创建一个简单的数据包路由器,如何跟踪"客户端"?
- 德拉吉诺 LG01-S 收到异常数据包并停止工作
- 从网络数据包复制一串 wchar 时访问冲突
- 使用 UDP 协议从 Windows 套接字发送到 Qt 套接字的网络数据包上的结构编码和解码
- 使用SFML验证实时网络上发送的数据包
- 在 Cassandra 中使用 "time" 作为行键来存储网络数据包
- 网络数据包创建/解析库
- 表示网络数据包的C++类
- 网络数据包解析类设计
- 如何用C/C++生成网络数据包
- 在具有不同UDP端口的网络计算机上发送/接收数据包
- 传递不同类型的数据,以void指针函数添加到网络数据包(我认为?)