用于通过网络在应用程序之间进行通信的协议/基础结构

Protocol/Infrastructure for communicating between applications over a network

本文关键字:协议 通信 结构 网络 之间 应用程序 用于      更新时间:2023-10-16

我有一个C++应用程序,它目前使用一个简单的TCP/IP客户端/服务器模型在自己的两个实例之间进行通信。这在本地网络上运行良好,但我希望它能在外部网络上使用。目前,可能由于防火墙问题,它无法通过外部网络进行连接。

我不是一个网络专家,但我想在中间有一个专用的服务器作为通信中心。这会缓解防火墙问题吗?

网络游戏是如何相互交流的?通常是在中间有一个服务器,还是对等的?

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

问候

我认为问题是由cnicutar提到的NAT引起的。

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

多人网络游戏没有事实上的架构。客户端-服务器(大多数MMO、大多数PC FPS和RTS)和点对点(大多数主机游戏)都是有效的方法。

Juoni Smed在《计算机游戏的算法和网络》一书中的调查很好地概述了野外的不同架构。

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

幸运的是,你可以使用像优秀的Raknet这样的现代框架,它包括状态同步、远程过程调用和NAT遍历。它对业余爱好者来说是免费的,并被整合到几个现代工业级游戏引擎中。

现代互联网通信的祸根是NAT。由于NAT(不应与简单的防火墙混淆),互联网上的大部分主机没有公共地址,因此无法(轻松)接受传入连接。NAT严重破坏了互联网,人们正转向一种完全不同的方案,语义略有不同,只是为了摆脱它

基本上有两类解决方案

  • NAT穿越,有时用于对等通信。通常NAT穿越方案需要一些公共访问的服务器来代理初始连接,但实际的通信是对等完成的

  • 客户端-服务器通信。这更容易(因为服务器通常应该有一个可公开访问的地址),但也有点效率低下。例如,假设您在同一个10Gb局域网上有一个对等设备。如果你想通过服务器(恰好在另一个国家)向他发送文件,这将需要很长时间,而不是几秒钟。

我不确定哪一个是"常用的"。但这样想吧:

  • 如果逻辑上需要一个"控制器"(比如8个人在玩策略游戏),那么你可能需要一个服务器
  • 如果任何两个对等体都可以在没有"控制器"的情况下进行逻辑交互,那么您可能想要对等通信
  • 如果你需要快速传输大量数据(文件传输),你几乎肯定想要p2p

实现所需功能的最简单方法是使用套接字(以防使用不同的套接字)。你连接应用程序的方式通常是如何完成的。此外,如果它在本地网络中工作,而不是通过互联网,那么它一定是防火墙问题,所以请尝试在路由器配置中打开端口。

你必须提供更多关于你的程序的信息,以便解释你应该使用对等还是服务器。