c++ - 是否可以在另一个网络中寻址服务器/客户端套接字?(C++)
问题描述
我编写了一个服务器/客户端应用程序,我首先在本地运行,然后在互联网上运行。因此,我将路由器配置为它接受端口 xxxx 上的数据并将其转发到我的服务器运行的机器以及它接受来自客户端套接字的连接的机器。所以一切运行良好,客户端可以互相发送消息。所以现在我的问题是,服务器怎么可能将数据发送到其他网络中的客户端,其中端口转发未激活,但是当我手动尝试时它不起作用。
我已经尝试搜索 TCP 如何保存 IP 和端口,并且我还查看了 Internet/TCP/UDP 的概念是如何工作的,但找不到问题的答案。
所以首先我想知道,在我实现没有端口转发的服务器之前,如果你有任何想法,如果你能在 Windows 上提供 C++ 的代码示例,我将不胜感激,这样我就可以在没有端口转发和外部的情况下建立这样的连接互联网上的服务器主机。
解决方案
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 后面,但您会收到带有网页的服务器响应而没有问题。
这是一个简化的解释,省略了本地/全局地址:端口详细信息。
推荐阅读
- java - 如何使用 java 1.4 将文本附加到现有文件中
- python - 在 Torch 和 numpy 中设置手动种子是否会传播到所有导入的脚本、嵌套函数等?
- angular - 无法从处理程序内部访问范围问题变量:函数
- xamarin.forms - MessagingCenter.Subscribe 在不听外人消息?
- android - 如何使 AutoComplete Google-API 特定于城市
- r - 多重回归 - model.frame.default 可变长度中的错误不同
- php - 在这种情况下如何使用 foreach 循环
- php - 什么在codeigniter中返回row_array()
- ubuntu - 什么是 fix-it-all.sh 以及如何运行它?
- google-chrome - 当我在 jenkins 上运行 selenium 测试用例时无法与 webelement 交互