其他分享
首页 > 其他分享> > c-使用SFML在实时网络上验证发送的数据包

c-使用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可能是解决之道.

而且不要重复自己

如果要使用单独的服务器应用程序,则不要使其也显示在屏幕上,只需在通过本地主机连接的服务器计算机上运行另一个客户端即可.

标签:sfml,frame-rate,c,network-programming
来源: https://codeday.me/bug/20191012/1897074.html