用于通过网络在应用程序之间进行通信的协议/基础结构
Protocol/Infrastructure for communicating between applications over a network
我有一个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
实现所需功能的最简单方法是使用套接字(以防使用不同的套接字)。你连接应用程序的方式通常是如何完成的。此外,如果它在本地网络中工作,而不是通过互联网,那么它一定是防火墙问题,所以请尝试在路由器配置中打开端口。
你必须提供更多关于你的程序的信息,以便解释你应该使用对等还是服务器。
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以使用winusb同时与多个相同的usb设备进行通信
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 如何使用url确定网站协议
- 混淆了如何使用IDL与Ethovision进行通信
- C++ Boost::asio串行通信与Arduino无法写入
- MSYS2 MinGW程序包中缺少grpc_cpp_plugin协议
- 用CMake构建C++协议
- 我是否需要包含隐式使用/与 WindowsAPI 通信"Windows.h"?
- 用于处理多个通信协议处理的设计类
- 如何让客户端通过modbus-tcp协议与多个服务器通信?
- 与语言服务器通信(Languager服务器协议)
- 使用 C/C++、SSL 协议的客户端和服务器通信不起作用
- 谷歌协议缓冲区与JSON:C++到C#通信
- 为分布式系统构建了一个自定义的C++通信协议
- 独立于平台套接字通信的协议
- 与Thrift或协议缓冲区的双向通信
- 用于数据传输的标准字节通信协议
- 用于通过网络在应用程序之间进行通信的协议/基础结构
- 协议缓冲区-Google protobuf:推荐使用C++库来处理通信