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

Posted

技术标签:

【中文标题】是否可以在另一个网络中寻址服务器/客户端套接字?(C++)【英文标题】:Is it possible to address a server/client socket in an another network ?(C++) 【发布时间】:2019-09-17 00:47:33 【问题描述】:

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

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

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

【问题讨论】:

搜索“NAT打孔”,你会发现像***.com/questions/23176800/…这样的文章 @RichardCritten 是的,我读过类似的内容,但是否有必要在客户端“会面”的地方有一个在线托管服务器?或者服务器是否也有可能在我的机器上运行,所有客户端都通过 Internet 连接到它?而且每次我搜索类似的东西时,都没有真正的例子来说明如何完成类似的事情,只有方案。 只有 NAPT 需要端口转发。它基本上在 NAT 表中放置一个手动配置的条目。当流量来自内部时,这将自动发生。 @RonMaupin 所以这就是服务器可以向客户端发送消息的原因? 假设它是 NAPT 后面的 IPv4,那么,是的,但请记住,并非一切都是这样。我知道很多人将他们的 PC 直接连接到 ISP 连接,因此他们的 PC 上有公共地址,并且没有 NAPT。 【参考方案1】:
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 之后,您仍会收到带有网页的服务器响应而没有问题。

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

【讨论】:

只有NAPT需要端口转发,基本NAT不需要。涉及传输协议地址(端口)的是 NAPT。 @RonMaupin:OP 提到了端口转发,我用它作为参考,以便于理解解释。为了简洁起见,我不得不描述一些不相关的概念。 "尽管您在 NAT 之后,但没有问题。" 但是您可以在 NAT 之后,并且在没有端口转发的情况下一切正常。需要端口转发的是 NAPT。 @RonMaupin:本段和描述的用例没有提及/涉及任何端口转发 你错过了我的观点。 NAT 不使用端口转发,因为它不对端口做任何事情。 NAPT 是必须使用端口转发的。我看到许多使用 NAT 的 DMZ,其中每个私有服务器地址都有一个公共地址。那只是使用NAT,没有端口转换,也没有端口转发。它只是 NAT(网络地址转换)。当你涉及端口时,它是 NAPT(网络地址端口转换)。术语在RFC 2663 中定义。

以上是关于是否可以在另一个网络中寻址服务器/客户端套接字?(C++)的主要内容,如果未能解决你的问题,请参考以下文章

使用 telnet 命令调用 SOAP Web 服务

是否有任何 TCP 设置会影响 SIGPIPE?

Linux 套接字socket与寻址详解

IOS4 - 在 Wifi 上使用 UDP 套接字发送数据

网络请求简略步骤概述

Go_socket编程