首页 > 解决方案 > 是否可以在另一个网络中寻址服务器/客户端套接字?(C++)

问题描述

我编写了一个服务器/客户端应用程序,我首先在本地运行,然后在互联网上运行。因此,我将路由器配置为它接受端口 xxxx 上的数据并将其转发到我的服务器运行的机器以及它接受来自客户端套接字的连接的机器。所以一切运行良好,客户端可以互相发送消息。所以现在我的问题是,服务器怎么可能将数据发送到其他网络中的客户端,其中端口转发未激活,但是当我手动尝试时它不起作用。

我已经尝试搜索 TCP 如何保存 IP 和端口,并且我还查看了 Internet/TCP/UDP 的概念是如何工作的,但找不到问题的答案。

所以首先我想知道,在我实现没有端口转发的服务器之前,如果你有任何想法,如果你能在 Windows 上提供 C++ 的代码示例,我将不胜感激,这样我就可以在没有端口转发和外部的情况下建立这样的连接互联网上的服务器主机。

标签: c++socketsnetworkingtcpc++17

解决方案


Clint -> NAT (router) -> ... -> NAT (router) -> server

当客户端发送一条消息(在 TCP 的情况下可以是连接尝试,如果是 UDP 则只是一条消息),它的 NAT 不会阻止它并记住它来自哪个本地地址:端口以及它要去的地址:端口至:[client address:port, server address:port]。当消息到达服务器的 NAT 时,NAT 知道您的服务器,因为您配置了“端口转发”并将消息传递到本地网络。现在,当服务器将消息发送回客户端并到达客户端的 NAT 时,NAT 会检查其内部表,找到此特定记录的记录server address:port,检索client address:port部分并将消息传递给它。所以一切都按预期工作。

这就是为什么通常当您打开浏览器并转到某个 Web 链接时,尽管您在 NAT 后面,但您会收到带有网页的服务器响应而没有问题。

这是一个简化的解释,省略了本地/全局地址:端口详细信息。


推荐阅读