C++ 套接字:PC 之间通过互联网进行通信

2023-12-19

我正在Windows 上使用winsocks 编写一个程序,可以将消息发送到另一台计算机。客户端与另一台计算机中的服务器连接并开始交换数据。

它在使用本地地址(192.168.1.*)的本地网络上工作正常,但我无法与公共地址(216.185.45.129)通信;甚至不是我自己的。我可以成功连接到端口 80 上的网站,但无法使用其公共 IP 地址连接到家里的笔记本电脑,无论我使用什么端口(未保留的端口)。

所以我在网上做了研究似乎唯一有效的解决方案是端口转发。

-但是就没有其他方法可以实现这一目标吗?

- Teamviewer 等其他程序如何连接到网络上的其他计算机?

- 是否有我可以使用的已打开但通常未使用的端口?

-至少,我可以转发端口吗my路由器但是not客户有做任何事吗?或者也许让我的程序自动转发端口。


主要问题是,每个路由器都在使用NAT http://en.wikipedia.org/wiki/Network_address_translation区分本地网络和 WAN 中的不同计算机。他需要这样做,因为你在互联网上只有一个IP,但你家里有几台设备。为了归档这个,他使用了端口组。这意味着,如果您使用两台设备从端口 2048 发送到互联网上的网络服务器,路由器会为一台设备提供另一个端口(例如 2049)。响应包含请求者的端口,因此路由器可以将其映射回来。不幸的是,大多数路由器总是映射端口,因此您永远不知道互联网端有哪个端口。

有两种常见的方法可以解决并实现您的目标。

  1. 转发端口 http://en.wikipedia.org/wiki/Port_forwarding

您可以强制大多数路由器不映射特殊端口,而是将它们绑定到唯一的 MAC 地址。您可以使用 UPNP 配置大多数路由器来执行此操作,但出于安全原因,我不建议这样做,而且它在路由器不允许 UPNP 操作的许多环境中不起作用。 大多数路由器出于游戏原因都具有端口转发功能(主要用于 P2P 网络) 它适用于 TCP 和 UDP。

  1. NAT穿越 http://en.wikipedia.org/wiki/NAT_traversal

常见的方式是NAT穿越,也称为NAT打洞。我将用UDP 的缩写来描述它。你可以找一下wiki的解释here http://en.wikipedia.org/wiki/TCP_hole_punching对于 TCP 和UDP http://en.wikipedia.org/wiki/UDP_hole_punching这里。不幸的是,您需要一个两个客户端都可以访问的互联网服务器。这里是步骤:

  1. 两个客户端都联系服务器。服务器现在知道两个客户端的 IP 和端口。
  2. 服务器将信息发送回客户端。
  3. 两个(!)客户端现在通过已知地址互相发送包裹。

两个客户端都必须发送 UDP 数据包,并且必须接受第一个数据包丢失的情况。原因就是路由器。如果客户端之前已将包发送到该源,则大多数路由器仅接受来自映射端口上的源的包。

UPDATE关于 Remy Lebau 的评论,我改变了防火墙穿透 http://tldp.org/HOWTO/Firewall-Piercing/index.html部分属于 NAT 穿越,因为它有部分错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 套接字:PC 之间通过互联网进行通信 的相关文章

随机推荐

  • 如何避免 TDateTime 数据舍入

    我正在为 FMX 编写列和单元格类TGrid其中将包含TCalendarEdit and TTimeEdit每个单元格中的实例 除了正确处理这些子控件中所做的更改之外 一切正常 type TFMTValue
  • 使用数组过滤 Linq 中的 IEnumerable

    如何添加字符串数组 string BranchIds 1 2 3 Linq 里面包含什么 我正在寻找类似的东西 var a abc GetRoutes 0 Where n gt n BranchId Contains BranchIds T
  • 如何从终端打开网络风暴

    要从终端编辑文件 我使用 subl 用于 sublime text 来编辑文件 示例 如果我需要编辑 app js 文件 我使用 subl app js 有什么方法可以设置 webstorm 从终端打开吗 在终端中尝试 wstorm and
  • 获取启动驱动器的序列号和其他信息

    我正在尝试获取启动驱动器的序列号 但我还不知道该怎么做 我确实知道分区 硬盘驱动器 但我想要启动分区的序列号 这是我到目前为止所拥有的 var searcher new ManagementObjectSearcher SELECT FRO
  • 默认成员值最佳实践

    编写 C 11 代码时在类的头文件中为类成员设置默认值是一个好习惯吗 或者在类的构造函数中执行此操作更好 EDIT I mean foo h include
  • Django 联合查询

    我需要在 Django 中使用 3 个模型 即 WebQuery WebReply 和 BusinessOwners 开发 UNION 查询 输出应采用以下形式 conversation id b id from user id email
  • 如何在python 3.7中安装pyramid-arima

    我正在尝试在 Windows10 上的 python 3 7 中实现 auto arima 所以我尝试使用以下命令安装 Pyramid armia pip install pyramid arima 但我收到错误消息 Could not f
  • 类型错误:输入最多需要 1 个参数,但得到 3 个

    我正在用 Python 制作一个小型猜谜游戏 计算机猜测玩家选择的数字 当我尝试要求用户输入时出现错误 answer input Is it guess 这条线抛出 类型错误 输入最多需要 1 个参数 但得到 3 个 我究竟做错了什么 in
  • 根据所选的第一个下拉列表获取下拉列表的值

    PHP MYSQL div style width 100 margin inherit padding left 100px div
  • 空手道中具有未定义变量的三元条件逻辑

    我有一个空手道功能文件 我们称之为一个特征 旨在由其他功能文件重用 通过使用共享范围 一个特征可以使用调用功能文件中定义的一些变量 例如国家 地区 我希望这些参数是可选的 但具有在中定义的默认值一个特征 为此 我使用三元条件逻辑 例如 de
  • Logback.xml配置

    我正在尝试将黑啤酒配置为保存到文件中 但是 它没有保存到文件中 您知道为什么吗 另外 我希望日志文件名可以在 logback xml 中配置 像 LOG FILE NAME 这样的东西将来自 cmd 这可能吗 这是我的 logback xm
  • 在 Git 中使用 trile

    我想使用一个简单的 git pull 来限制trickle http monkey org marius trickle trickle 1 txt 这看起来应该很容易 trickle d 100 git pull 但是当 git 显示其带
  • 有没有办法使用带有默认字段和 __slots__ 的数据类

    我想把 slots 在具有默认字段的数据类上 当我尝试这样做时 我收到此错误 gt gt gt dataclass class C slots x y x int y int 1 Traceback most recent call las
  • 将对象数组转换为新数组及其子数组

    我有一个像这样的数组 var data name Movies info category name content name Interstellar info category data name Dark Knight info ca
  • 有没有办法让 SQL 变量保持常量?

    有没有办法让 SQL 变量保持常量 不 但您可以创建一个函数并将其硬编码在其中并使用它 这是一个例子 CREATE FUNCTION fnConstant RETURNS INT AS BEGIN RETURN 2 END GO SELEC
  • 如何正确进行 sbt 程序集合并?

    在我们的 Scala Scalatra 项目中 我们有这个插件合并策略sbt assembly assemblyMergeStrategy in assembly case x gt val oldStrategy assemblyMerg
  • 无法打开“../tweets.php”进行包含(include_path='.:')

    我正在尝试使用以下代码包含一个脚本 div class main content div 但它不断抛出以下错误 警告 包含 tweets php 无法打开流 没有这样的文件或 目录 第 52 行警告 include 打开失败 tweets
  • 通过部署 Xamarin.iOS-App 缺少资产目录

    我正在 VS 中为连接到 MacinCloud 的 Windows 开发一个适用于 iOS 的 Xamarin App 当我在 MacinCloud 的应用程序加载器中将我的应用程序部署为 ipa 文件时 没有任何错误 但每次我收到苹果发来
  • 如何使用 Eclipse 调试 servlet

    拥有一个 servlet 它可以在 TomCat 中运行 但是 我不知道如何在 Eclipse Java 标准版 中调试它 有什么建议么 首先确保您正在使用 Eclipse IDE 用于企业Java 开发人员 https www eclip
  • C++ 套接字:PC 之间通过互联网进行通信

    我正在Windows 上使用winsocks 编写一个程序 可以将消息发送到另一台计算机 客户端与另一台计算机中的服务器连接并开始交换数据 它在使用本地地址 192 168 1 的本地网络上工作正常 但我无法与公共地址 216 185 45