使用SFML验证实时网络上发送的数据包

Verifying sent packets on real time network using SFML

本文关键字:数据包 网络 SFML 验证 实时 使用      更新时间:2023-10-16

我正在构建一个可联网的程序,该程序使用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也可能会完成这项工作),你的客户端应该发送命令/更改/数据,只对接收到的数据做出反应,永远不要麻烦发送回布尔值(或单个位),因为有更好的方法来处理这个问题,而且这是对整个数据包的巨大浪费。

简单的方法

  1. 如果客户端从未收到请求的特定返回值,只需在给定的时间阈值后将请求重新发送到服务器,并抱着最好的希望
  2. 如果客户端没有任何更改,服务器也没有任何内容,只需重新绘制屏幕(或等待客户端更改)
  3. 如果在一个或多个重新发送请求后服务器没有任何消息,请将问题通知客户端(连接丢失或服务器错误)

在我所描述的中,服务器只需要响应客户端的请求一次,然后就忘记了

  1. 如果服务器从未接收到请求(因此从未响应客户端),客户端无论如何都会发回请求
  2. 如果服务器和客户端之间的服务器响应丢失,客户端将在时间阈值之后再次将其请求发送回服务器

很难为您提供正确的解决方案,因为我们缺乏有关您试图实现的项目的信息。

但我们可以说这是一场游戏。

如果这是一个游戏,简单的方法是

在游戏中,你不会信任客户端,所以玩家所做的每一个命令都会发送到服务器。服务器处理命令,进行所有计算,并在整个游戏中跟踪所有玩家。

然后,服务器将新位置返回给客户端。客户端只显示来自服务器的更改。例如,客户端从不在键盘输入上移动播放器。输入只需按原样发送到服务器,客户端从服务器接收新位置,移动指定的图形,然后渲染到屏幕上。

就是这样。

真实世界的方式

事实上,真实世界的游戏客户端处理输入,他们试图在向服务器发送请求之前/期间插入更改,然后根据接收到的数据进行调整。这给人一种没有滞后的错觉,即使网络通信不可避免地会延迟。延迟仍然存在,因为数据包在连接不良或间歇性延迟时丢失,但插值仍然有帮助。

这样,您仍然不信任客户端,您只是在服务器响应之前进行猜测。

那么,有了这些,TCP还是UDP

这些策略与协议无关,因为你自己处理问题。

UDP

如果你要发送大量只与发送时间相关的数据,UDP就会完成这项工作。想想视频会议或语音聊天,当你丢失一个数据包时,已经太晚了,无法将其发送回来。

TCP

如果你要发送适量的信息,比如每秒只发送60次位置,那么接收顺序可能比带宽或延迟更重要,所以TCP可能是最好的选择。

不要重复你自己

如果你要有一个单独的服务器应用程序,不要让它也显示在屏幕上,只需在服务器机器上运行另一个客户端,通过localhost连接即可。