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 之间通过互联网进行通信 的相关文章

  • 为什么 std::vector 可以处理类定义中的不完整类型?

    出现了以下问题 C 标准似乎说 std vector需要一个完整的类型才能工作 看https en cppreference com w cpp container vector https en cppreference com w cp
  • 错误:表达式不可赋值三元运算符

    我有以下代码 MPLABX XC8 编译器给出此错误 错误 表达式不可分配 U1ERRIRbits RXFOIF uart1 oerr 1 uart1 oerr 0 这是相关代码部分 typedef union struct bool fe
  • 如何使用T4从一个模板同时生成两个文件?

    我遇到的情况是 我需要生成两个 CSharp 代码文件 它们的代码几乎相同 但方法的输入和输出类型的命名空间不同 事实上 每个文件都针对特定国家 地区 并且类型来自特定国家 地区的 WSDL 我正在围绕服务编写一些包装器 逻辑完全相同 但从
  • CMake(Ninja 后端)使用 /MT 编译

    我有一个类似的问题CMake 使用 MT 而不是 MD 进行编译 https stackoverflow com questions 14172856 cmake compile with mt instead of md但有一些差异 我正
  • 如何在 C++ 中为指针“this”赋值

    在函数中 如何分配this一个新的价值 您可以分配对象this点于 this XY 但你不能分配直接值this this XY Error Expression is not assignable
  • 如何以编程方式删除受信任的根证书颁发机构中的证书?

    我需要能够从组织中的每台电脑中删除特定的证书 是的 我可以逐个座位 但我要到周四才能完成 而且我没有人力逐个座位 是否有使用 C 的编程方式来执行此操作 我认为你不需要编写任何 C 看看certmgr exe del http msdn m
  • Visual Studio 2013 调试器显示 std::string 的奇怪值

    我有一个大型的 cmake 生成的解决方案 其中包含许多项目 由于某种原因 我无法查看字符串的内容 因为根据调试器 Bx Buf含有一些垃圾 text c str 正确返回 Hello 该问题不仅仅发生在本地字符串上 返回的函数std st
  • 维护 VS Test Project 中单元测试方法之间的上下文

    我想按顺序运行以下单元测试 使用随机数字的名称 密码等创建新客户 检索刚刚创建的客户并断言其属性包含相同的随机数 对同一用户调用 ForgotPassword 函数 并使用相同的随机数作为用户名 清楚地看到 我需要生成一次随机数 并在 3
  • 大量互斥体对性能的影响

    假设我有一个包含 1 000 000 个元素的数组 以及多个工作线程 每个线程都操作该数组中的数据 工作线程可能会使用新数据更新已填充的元素 但每个操作仅限于单个数组元素 并且独立于任何其他元素的值 使用单个互斥锁来保护整个数组显然会导致高
  • 重载算术运算符

    赋值运算符可以声明为 T 运算符 const t 在类中 但不能以这种方式定义算术运算符 它必须是友元函数 我不明白为什么 你能解释一下吗 算术运算符不必须是友元 那么你可以这样定义 MyClass MyClass operator con
  • 如何在 C++ 中正确使用 cin.fail()

    我正在编写一个程序 从用户那里获取整数输入cin gt gt iUserSel 如果用户输入一个字母 程序就会进入无限循环 我试图用下面的代码来阻止这种情况 但程序进入无限循环并打印出 错误 输入 我该如何修复我的程序 cin gt gt
  • 运行实体框架自定义工具,它有什么作用?

    在 Visual Studio 中 当使用实体框架并为 tt 和 Context tt 文件应用运行自定义工具时 它是什么以及它有什么作用 为什么它解决数据库同步问题 有时 为什么我应该在运行 tt 之前运行它 Context tt 它被称
  • C++网络序列化[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一种将 C 数据包序列化为网络流的解决方案 我在这里看到很多帖子提到人们 ACE 谷歌协议缓
  • Clang 5.0 上的 vsprintf 和 vsnprintf [-Wformat-nonliteral] 警告

    我有这段代码 static void err doit int errnoflag int level const char fmt va list ap int errno save unsigned long n char buf MA
  • 在 Visual Studio 2012 Express 中设置 C++ 调试环境

    我需要调试的应用程序需要设置环境变量 这在 Visual Studio 2012 中似乎非常复杂 我想做类似的事情 set path c foo c bar c windows c program files application set
  • 为什么存在系统调用

    我一直在阅读有关系统调用及其在 Linux 中如何工作的内容 我还有更多的阅读要做 但我读过的一件事都没有回答 那就是 为什么我们需要系统调用 我知道系统调用是用户空间程序要求内核执行某些操作的请求 但我的问题基本上是 为什么用户空间程序本
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 尝试后终于没有被调用

    由于某种原因 在我的控制台应用程序中 我无法运行我的finally 块 我编写这段代码是为了测试finally块是如何工作的 所以它非常简单 static void Main int i 0 try int j 1 i Generate a
  • 使用空的weak_ptr作为参数调用map::count安全吗?

    打电话安全吗map count http www cplusplus com reference map map count on an 未初始化因此为空weak ptr http en cppreference com w cpp mem
  • Adobe Illustrator 中的折线简化如何工作?

    我正在开发一个记录笔划的应用程序 您可以使用定点设备来绘制笔划 在上图中 我绘制了一个笔划 其中包含 453 个数据点 我的目标是大幅减少数据点的数量 同时仍然保持原始笔画的形状 对于那些感兴趣的人 上图笔画的坐标可以作为GitHub 上的

随机推荐

  • 如何避免 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