多插座'握手'在UDP网络中使用SFML C ++库

时间:2015-05-04 17:25:48

标签: c++ sockets network-programming udp sfml

我正在使用SFML库使用UDP协议编写实时网络程序。服务器将处理所有处理,将数据包发送到客户端,反之亦然。

我需要一种方法来同步屏幕更新,因为网络两侧都会有一个实时用户界面。我的想法是,我将让客户端和服务器打开两个端口,1个用于发送数据包,另一个用于验证'端口。

一旦进行了更新和验证,两个循环都将通过网络发送一个字节,表明他们的一方已准备好了#39;一旦准备就绪'方接收该字节,它将知道屏幕已准备好双方更新,然后呈现更新。

我的问题是,如何使用SFML库在C ++中执行此操作。逻辑是否正确,我是否会遇到网络错误等。

评论是否需要清理。

1 个答案:

答案 0 :(得分:0)

您应该阅读主题,看看它是如何运作的,例如How do the protocols of real time strategy games such as Starcraft and Age of Empires look?

根据SFML,没有什么特别要知道的,因为该理论适用于每种编程语言(使用套接字)。并且你没有提供你正在努力的代码,所以没有Minimal, Complete, and Verifiable example我就无法帮助。

但我要说的一件事就是永不等待网络渲染。如果您想要“实时”,这将是一个迟滞,您必须在没有真正“实时”的情况下模拟它,因为网络总会存在延迟。

如果你使用UDP,你没有选择,只能打开2个端口,一个在服务器上,一个在客户端上。但我会反对使用 “确认”端口,因为这样无用,因为您无论如何都会每秒发送多次。

how to use sockets with SFML。我想你已经知道了这一点,但它可能对来自谷歌的人有用。

请参阅SFML networking rts,它解释了比我更好的方法。

来自@muhwu

  

一般情况下,如果您要进行具有时序关键元素的实时游戏,您应该将命令播放器稍微放在未来,以弥补延迟。这最多可以是几百毫秒。

来自@sean-middleditch

  

另请注意,许多文章都已过时。例如,对于像RTS这样的游戏中的网络来说,TCP是一个非常好的选择,特别是使用锁步网络,甚至是许多小型MMO的首选协议。尽管如此,几乎所有关于网络的文章都是关于构建自定义UDP协议的。

说到gamedev.stackexchange.com,您可能想要阅读问题和答案,如果这没有帮助,那么请问那里。

在SO上询问the same question可能不是最佳选择,因为您的问题过于宽泛且已经多次回答(就像我链接的第一个问题)。