我有一个C ++应用程序,当前使用简单的TCP / IP客户端/服务器模型在它自己的2个实例之间进行通信。这在本地网络上运行良好,但我希望在外部网络中使用它。目前,可能由于防火墙问题,它无法通过外部网络连接。
我不是网络专家,但我正在考虑在中间使用专用服务器作为通信中心。这会减轻防火墙问题吗?
网络游戏如何相互通信?中间通常是服务器还是点对点?
无论如何,我很欣赏有关实现支持网络的应用程序的协议和基础设施的任何建议。
此致
答案 0 :(得分:1)
我认为问题是专门针对cnicutar提到的NAT。
也许你想看看libupnp硬件防火墙(你家里的路由器)的自动端口转发
答案 1 :(得分:1)
多人网络游戏没有事实上的架构。客户端 - 服务器(大多数MMO,大多数PC FPS和RTS)和点对点(大多数控制台游戏)都是有效的方法。
Juoni Smed在他的书“Algorithms and Networking for Computer Games”中的调查是对野外不同建筑的一个很好的概述。
对于您所讨论的具体问题,正如其他人所指出的那样,您对代理服务器的需求可能归结为NAT问题 - 您尝试说话的两台计算机没有公共IP地址。如果您想要实现点对点架构(或让您的一个客户充当服务器,就像许多现代客户端 - 服务器游戏一样),您将需要您的客户直接相互交谈。这可以通过NAT Traversal实现,遗憾的是这是一个繁琐的过程。
幸运的是,你可以使用像优秀的Raknet这样的现代框架,其中包括状态同步,远程过程调用和NAT Traversal开箱即用。它适合业余爱好者使用,并被纳入几个现代工业级游戏引擎。
答案 2 :(得分:0)
实现所需内容的最简单方法是使用套接字(如果您使用不同的方式)。您连接应用程序的方式通常是如何完成的。此外,如果它在本地网络中工作并且它不通过Internet,则必须是防火墙问题,因此请尝试在路由器配置中打开端口。
您需要提供有关您的计划的更多信息,以便解释您是应该使用点对点还是服务器。
答案 3 :(得分:0)
现代互联网通讯的祸根是NAT。由于NAT(不应该与简单的防火墙混淆),互联网上的大部分主机没有公共地址,因此不能(轻松)接受传入连接。 NAT打破互联网非常糟糕,人们正在转向totally different scheme,语义略有不同,只是为了摆脱它。
基本上有两类解决方案
NAT traversal,有时用于点对点通信。通常,NAT遍历方案需要一些可公开访问的服务器来代理初始连接,但实际的通信是通过对等方式完成的
Client-server communication。这更容易(因为服务器通常应该具有可公开访问的地址),但也有点低效。例如,假设您在同一个10Gb LAN上有一个对等体。如果你想通过服务器(恰好在另一个国家/地区)向他发送文件,那么它将需要很长时间而不是几秒钟。
我不确定哪一个是“普遍使用的”。但是这样想一想: