自动启用从 Internet 访问端口 4900 的方法

2024-04-12

我正在编写一个在端口 4900 上运行的自定义 p2p 程序。在某些情况下,当用户位于路由器后面时,无法从互联网访问该端口。

是否有一种自动方式可以从互联网访问该端口。我不太确定其他 p2p 应用程序是如何工作的。

有人能解释一下吗?


简而言之,P2P 连接。假设我们在这里讨论的是 UDP。经过一些调整,以下步骤也可以应用于 TCP。

  1. 枚举所有本地 IP 地址(通常只有 1 个)。为每个具有 IP 地址的适配器在给定端口号**上创建 UDP 套接字。

  2. 对于步骤 1 中创建的每个套接字,联系具有相同套接字的 STUN 或 TURN 服务器,以发现您的外部 IP 地址并发现内部端口号映射到 NAT 外部的内容(它并不总是相同的端口值)。也就是说,您的本地地址 192.168.1.2:4900 对于外界来说可能是 128.11.12.13:8888。当使用相同的本地端口到其他 IP 地址时,某些 NAT 并不总是使用相同的端口映射。 TURN 还将为您提供一个“中继地址”。如果路由器支持该协议,您还可以使用 UPNP 直接从路由器获取端口映射地址。

  3. 通过集合服务(SIP、XMPP、即时消息、Web 服务、电子邮件、带字符串的杯子),将您的地址候选列表发布到服务或向其他客户端发送通知,说:“嘿,我想与您联系”。此消息包括在步骤 1 和 2 中收集的所有“候选地址”(IP 和端口对)。

  4. 远程客户端在收到连接邀请后,也会执行上述步骤 1 和 2。然后通过他接收邀请者的候选人列表的同一渠道发回他的候选人列表。

  5. 打孔步骤。两个客户端开始通过 UDP 向对方的候选地址发送测试消息,并在各自的一端侦听相同的消息。每当收到消息时,请回复消息来源的地址。最终,客户端会发现他们有一对地址,他们也可以可靠地发送数据报。通常,一个端点最终决定与哪个地址对(套接字)进行通信,并且协议帮助该端点告知另一端点这一决定。

**- 通常最好不要依赖 P2P 客户端的众所周知的端口。因为同一 NAT 或防火墙后面的两个客户端不可能同时使用您的软件。

以下是一些需要探索的技术的快速总结。

STUN http://en.wikipedia.org/wiki/STUN- 是一个简单的服务器和协议,供 NAT/路由后面的客户端发现其外部 IP 和端口映射。

TURN http://en.wikipedia.org/wiki/TURN是 STUN 的扩展,但支持防火墙和 NAT 阻止直接连接的 P2P 连接场景的中继。

ICE http://en.wikipedia.org/wiki/Interactive_Connectivity_Establishment是使用 STUN 和 TURN 建立 P2P 连接的一组步骤。 ICE 是上述步骤 1-5 的正式协议。 ICE 上的两套优秀幻灯片是here http://www.jdrosen.net/uploads/1/5/0/0/15008848/ice-basic-tutorial.pptx and here http://www.jdrosen.net/uploads/1/5/0/0/15008848/ice-ietf-tutorial2.pptx.

WebRTC http://www.webrtc.org/是 ICE 标准的变体,也是使用 STUN 和 TURN 进行 P2P 会话的参考库。

UPNP + 互联网网关设备协议 http://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol- 有些路由器支持主机自动获取端口映射。

libnice http://nice.freedesktop.org/wiki/是一个用于 Linux(并且可能在 Windows 上工作)的开源 C 库,它实现了 ICE。

libjingle http://code.google.com/apis/talk/libjingle/index.html是 Google 的另一个 ICE 实现(C++ 语言)。适用于 Windows 和 Linux。

PJNATH http://trac.pjsip.org/repos/wiki/Using_Standalone_ICE是一个图书馆PJSIP http://www.pjsip.org/编码库套件。它是 ICE 堆栈(C 代码)的良好实现,并且已被移植到很多平台。 (Windows、Linux、Mac、iOS、Symbian 以及即将推出的 Android)。

最后,我有一个明目张胆的插头供你使用我的 STUN 服务器代码库 https://github.com/jselbie/stunserver.

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

自动启用从 Internet 访问端口 4900 的方法 的相关文章

  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 不同枚举类型的范围和可转换性

    在什么条件下可以从一种枚举类型转换为另一种枚举类型 让我们考虑以下代码 include
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • Windows 窗体:如果文本太长,请添加新行到标签

    我正在使用 C 有时 从网络服务返回的文本 我在标签中显示 太长 并且会在表单边缘被截断 如果标签不适合表单 是否有一种简单的方法可以在标签中添加换行符 Thanks 如果您将标签设置为autosize 它会随着您输入的任何文本自动增长 为
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写

随机推荐