Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建PHP P2P游戏客户端跟踪器_Php_C++_Networking_P2p - Fatal编程技术网

创建PHP P2P游戏客户端跟踪器

创建PHP P2P游戏客户端跟踪器,php,c++,networking,p2p,Php,C++,Networking,P2p,目前,我正在考虑使用P2P创建一个网络游戏。游戏节奏不是很快,而且我没有专用服务器,所以P2P对我来说似乎是个不错的选择。我确实可以访问在线域。程序设计是在C++中完成的。 忘记了游戏网络的危险,我认为P2P不需要任何形式的集中式服务器通信。然后我想,‘但我怎么能找到其他游戏用户在不知道他们的IP的情况下托管游戏呢?’。我现在的想法是,我需要某种中央“集线器”,游戏可以连接到该集线器,以获得具有IP和端口的可用对等主机列表。然后,它将连接到该主机并使用UDP发送数据(我知道它是无连接的,但看起来

目前,我正在考虑使用P2P创建一个网络游戏。游戏节奏不是很快,而且我没有专用服务器,所以P2P对我来说似乎是个不错的选择。我确实可以访问在线域。程序设计是在C++中完成的。 忘记了游戏网络的危险,我认为P2P不需要任何形式的集中式服务器通信。然后我想,‘但我怎么能找到其他游戏用户在不知道他们的IP的情况下托管游戏呢?’。我现在的想法是,我需要某种中央“集线器”,游戏可以连接到该集线器,以获得具有IP和端口的可用对等主机列表。然后,它将连接到该主机并使用UDP发送数据(我知道它是无连接的,但看起来ENet有一些技巧)。如果我的想法完全荒谬,那就告诉我

我的想法是在我的在线域名上制作一个非常简单的PHP客户端IP交换机。这个游戏不会吸引超过2到3个人,因为它只是为了我个人的学习目标,所以我认为这个领域的负载不会太大。问题是,我真的找不到任何有用的信息来使用PHP制作任何类似的东西。我试着浏览了一下SO的“类似问题”,但仍然找不到很多信息

我的问题是:如果可能的话,如何创建PHP游戏客户端/主机跟踪器?你知道这方面有什么好的网站或文章吗


另一方面,我希望结合使用ENet和SFML,ENet用于可靠的UDP数据包,SFML用于数据包生成器。这是一个可行的选择吗?

像往常一样,对于你想做的事情,有几种选择是可以接受的

使用P2P连接很棘手,但可能很强大,特别是在VOIP和多人在线游戏等低延迟领域

我认为您需要公开一个服务器,该服务器将处理与连接的玩家相关的信息和状态。对于这一部分和网络,我建议使用
C++
,因为您会发现大量使用这两种语言的示例,而且您可能会发现它们非常健壮和可扩展。但这最终取决于你

该组件的作用是接受来自想要加入或创建游戏的玩家的传入连接。它将保存当前已连接的游戏和用户列表,并向新加入的玩家提供这些列表

很简单,不是吗?现在,您必须对游戏架构做出选择。这里的选择是在玩家之间使用
P2P
连接,或者使用服务器作为每个玩家之间的代理

将服务器作为代理

服务器保存着关于每一场比赛和玩家的信息,可以用来转发玩家之间的连接。这在可伸缩性和性能方面是相当不足的,因为您正在创建一个单点故障,即您的服务器,但由于您对该域的要求较低,因此它可能是您的一个选择

在这种情况下,当一个玩家想要加入游戏时,服务器可以接受一个新的连接(例如在另一个套接字上),并向所有其他玩家广播消息,这样当另一个玩家加入、移动、射击时,游戏中的每个人都可以收到一个广告

对等连接

这有点棘手。服务器将始终用于了解当前存在哪些玩家和游戏,但它不负责管理用户之间的连接,它可以简单地告诉想要加入游戏的玩家“嘿,你将要加入一个新游戏,如果你愿意,请联系
10.20.30.40
”。这将是“主持”游戏的人的公共IP地址

然后你将遇到第一个大困难。如果这个主机在路由器后面,你将如何与他通信?您需要在客户端实现NAT遍历功能,以允许传入的玩家访问在其路由器之间托管游戏的计算机

VOIP应用程序在请求路由器打开某些端口并将其重定向到所需计算机时使用了一些技术来解决此问题(比如Skype)。这是一个棘手的问题,因为它需要时间,并且不是在每个路由器上都实现的,所以这可能会导致完全失败。在本例中,假设我们可以轻松克服此问题,然后进入下一个问题

当连接到游戏主机时,您可以询问他哪些其他玩家也连接到游戏,并为您当前连接的其他玩家做广告。 这里的想法是让比赛中的每个球员都互相谈论更新(同样,这可能是移动、射门、私人消息或其他),以便让每个球员保持同步(相信我,他们不会)。您可能还希望实现一个排序包算法(最好使用UDP或ENet),在该算法中,您将定义如何将广告和消息广播给其他播放机

以一场比赛为例,有4名球员与之相连。这里有主持人Bob,Alice他的邻居,Tom一个住在纽约的家伙,Mike另一个我们在本例中需要的家伙

Alice首先连接到Bob的游戏,她通知Bob她加入了他的游戏,每次更新Bob和Alice都会交换关于当前比赛状态的信息。现在Tom进来告诉Bob他是新玩家,Bob告诉Tom有另一个玩家已连接,并给他她的IP地址(Alice的)。现在Bob告诉Alice有人已连接,并告诉她他的IP地址。想象鲍勃死了,鲍勃会告诉爱丽丝他死了,因为在汤姆上场之前,他一开始就习惯于和她说话,现在是爱丽丝需要告诉汤姆鲍勃刚刚死了

你可以去看电影