2011-06-27 43 views
1

我有一个C++应用程序,它目前使用简单的TCP/IP客户端/服务器模型在其自身的两个实例之间进行通信。这可以在本地网络上正常工作,但我希望在外部网络中使用此功能。目前,可能是由于防火墙问题,它无法通过外部网络连接。通过网络在应用程序之间进行通信的协议/基础结构

我不是网络方面的专家,但我在考虑让中间的专用服务器充当通信中心。这会缓解防火墙问题吗?

网络游戏如何相互沟通?中间是否有服务器?或者是点对点吗?

在任何情况下,我会很感激任何关于协议和基础设施的建议,以实现支持网络的应用程序。

问候

+0

使用代理服务器。游戏服务器是完全不同的现象。 http://acme.highpoint.edu/~msmith/teaching/HallOfFame/Dedicated%20Game%20Servers_2002Fall.pdf – DumbCoder

回答

0

现代互联网通信的祸根是NAT。由于NAT(不应该与简单的防火墙混淆),因特网上的大部分主机没有公共地址,因此不能(容易地)接受传入的连接。 NAT严重破坏互联网,人们正在转向totally different scheme,语义略有不同,只是为了摆脱它。

基本上有两种类有时用于对等网络通信的解决方案

  • NAT traversal的。通常,NAT穿越方案需要一些可公开访问的服务器来代理初始连接,但实际的通信是通过点对点方式完成的

  • Client-server communication。这很容易(因为服务器通常应该有一个可公开访问的地址),但也有一种低效。例如,假设你在同一个10Gb局域网上有同行。如果你想通过服务器发送一个文件(恰好在另一个国家),它需要花费时间而不是秒。

我不确定哪一个是“一般使用”。但想到它是这样的:

  • 如果有一个“控制器”的逻辑需要(比如8人在玩策略游戏),那么你可能需要一台服务器
  • 如果任何两个实体进行逻辑交互如果没有“控制器”,您可能需要点对点通讯
  • 如果您需要快速传输大量数据(文件传输),则几乎肯定需要p2p。
0

最简单的方式来完成你想要的是通过使用套接字(如果你正在做不同的话)。您连接应用程序的方式通常是如何完成的。另外,如果它在本地网络中工作并且不通过互联网,它必须是防火墙问题,因此请尝试在路由器配置中打开端口。

您将不得不提供更多关于您的程序的信息,以解释您是否应该使用点对点或服务器。

1

我认为这个问题专注于cnicutar提到的NAT。

也许你想看看libupnp在硬件防火墙自动端口转发(你的路由器在家里)

1

有多人网络游戏没有事实上的架构。客户端 - 服务器(大多数MMO,大多数PC FPS和RTS)和Peer-to-Peer(大多数控制台游戏)都是有效的方法。

Juoni Smed在他的书“Algorithms and Networking for Computer Games”中的调查是对野外不同架构的很好的概述。

对于您所谈论的特定问题,您需要一个代理服务器,正如其他人所指出的,可能是由于NAT问题 - 您试图说话的两台机器没有公共IP地址。如果你想追求对等体系结构(或者让你的一个客户端充当服务器,就像很多现代客户端服务器游戏一样),你需要你的客户端直接对话。这可以通过NAT Traversal来实现,不幸的是这是一个繁琐的过程。

幸运的是,您可以使用现代框架,如优秀的Raknet,其中包括开箱即用的状态同步,远程过程调用和NAT穿越。它对爱好者来说是免费使用的,并且被纳入到几款现代工业级游戏引擎中。

相关问题