问题标签 [hole-punching]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1391 浏览

c# - UdpClient.Send 方法和 UdpClient.Client.Send 方法的区别

我可以使用 UdpClient.Send(byte array) 或 UdpClient.Client.Send(stream) 方法在整个 udp 协议中发送数据。两种方法都有效。唯一的区别是,在一种方法中我传递一个字节数组,而在另一种方法中我传递一个流。

快速示例:

还有哪种方法可以确保我的数据到达目的地而不会丢失信息?我已经读过 udp 协议不能确保所有字节都到达它的目的地,因此更适合流式传输视频、音频,但不适用于像我正在做的那样传输文件。我使用 udp 而不是 tcp 的原因是因为在恰好位于路由器后面的两个用户之间建立 tcp 连接非常复杂。我知道如果其中一位用户在他的路由器上启用端口转发是可能的。我设法通过所谓的 udp 打孔来发送数据。udp 打孔使您能够在服务器的帮助下在路由器后面的两个用户之间建立连接。在这里解释它是如何工作的将会很长,如果你用谷歌搜索它,你可以找到很多信息。不管怎样,我只是想让你知道我为什么使用 udp 而不是 tcp。我现在不知道是否可以使用此协议发送文件以确保没有数据丢失。也许我必须创建一个算法。或者 UdpClient.Client.Send 方法可能确保接收到数据,而 UdpClient.Send 方法不确保接收到数据。

0 投票
5 回答
6141 浏览

c++ - 两台电脑不开端口通讯,使用第三台电脑建立连接

假设我有一个服务器,两个客户端连接到它。(通过 TCP,但没关系)

我的目标是允许这两个客户端之间的直接连接。这是为了允许两个玩家之间直接语音联系,例如,或者他们可能安装的任何其他不需要服务器交互的客户端插件(比如在两者之间玩某种随机游戏)。服务器可以在那里帮助建立连接。

从黄昏的回答中,我得到了几条线索:

http://en.wikipedia.org/wiki/STUN描述了一个算法来做到这一点,以及
http://en.wikipedia.org/wiki/UDP_hole_punching

从中,我得到了更多的线索:

http://www.h-online.com/security/features/How-Skype-Co-get-round-firewalls-747197.html
http://nutss.gforge.cis.cornell.edu/stunt.php -- TCP 可能的 STUN 实现

随着时间的推移,我肯定可以为我的程序设计一些东西。现在我正在使用 C++ 和 TCP(Qt 套接字或 Boost 套接字),但如果需要,我不介意在 C 中执行 UDP 并包装它。

任何有 C 和 C++ 经验的程序员都可以通过链接到示例程序、更新的库或任何其他有用的信息来提供使这更容易的提示。一个有文档的、灵活的、可工作的 C++ TCP 实现将是最好的,但我会接受我得到的!

0 投票
1 回答
724 浏览

http - 在 http 上打孔

我怎样才能在http上打孔,就像我在godaddy中有一个服务器它对tcp监听器的端口访问已关闭,所以我可以从它的请求中获取客户端的端口号到aspx页面吗?

0 投票
1 回答
1412 浏览

java - 用于 UDP NAT 打孔的 PHP 和 Java...?

我想在我的一个 java 应用程序中使用 NAT 打孔,但我不知道从哪里开始。我想要一些示例代码开始......(我可以访问带有套接字、cURL 和服务器套接字的 PHP 服务器,所以一些 PHP 服务器代码也将不胜感激......)

提前致谢。

编辑:对不起,我不够清楚。我想知道如何创建一个可以作为打孔“中间人”的 PHP 服务器。我还想知道如何制作一个可以连接到 PHP 服务器的 Java 应用程序,并在另一个 Java 应用程序连接到同一端口上的第一个应用程序时保持该连接。(这是我对 NAT 打孔工作原理的印象)

0 投票
1 回答
3724 浏览

c++ - UDP NAT打孔示例

我尝试在谷歌和这里搜索,但我仍然找不到简单的 C\C++ 示例 udp 打孔算法。如果你知道我在哪里可以找到它,请帮忙。谢谢!

0 投票
1 回答
188 浏览

networking - 不同 NAT 中的虚拟机

我想模拟三台计算机,每个人都在不同的 NAT 后面,以测试打孔。

我想要一台服务器,它的地址对其他两个 VM 来说是已知的,但是这两个 VM 位于不同的 NAT 中。

关于如何在工作站 7 中配置它的任何想法?

谢谢 :)

0 投票
4 回答
3505 浏览

udp - udp 打孔和端口限制锥形 NAT

我想了解当端口受限锥形 NAT 后面的两台主机建立连接时,udp 打孔是如何工作的。

据我了解,它分几个阶段发生,涉及三个主机。

主机 A 和主机 B 位于端口受限锥形 NAT 之后。

主机 C 是一个服务器,可以接收来自主机 A 和 B 的数据包。

  1. A 向 C 发送一个数据包。
  2. C从A接收数据包并确定A的外部地址:端口对
  3. B 向 C 发送一个数据包。
  4. C从B接收数据包并确定B的外部地址:端口对
  5. C将B的外部地址:端口发送给A
  6. C发送外部地址:A的端口到B
  7. A 将 packet_1 发送到 B 的外部地址
  8. B 将 packet_2 发送到 A 的外部地址

问题是:

受限锥形 NAT 后面的 A 如何接收来自同样在受限锥形 NAT 后面的 B 的数据包?

端口受限的锥形 NAT 不允许接收源地址:端口对与它发送的目标地址:端口对的数据包不匹配的数据包。为什么在 A 和 B 之间发送的其他数据包到达 A 和 B?

是不是因为端口受限的锥形 NAT 将 packet_2 视为来自 B 的响应?

所以 packet_1 会丢失,但 packet_2 会到达 B。我说的对吗?

先感谢您。

0 投票
2 回答
2643 浏览

c# - C# UDP 无法侦听已用于发送数据的端口?

我是 UDP/网络编程的新手,我正在尝试通过 UDP 创建一个聊天板。

我的最终目标是做 UDP 打孔(类似于 Skype 的概念),所以我需要监听与用于发送数据的端口相同的端口,否则 NAT 将丢弃传入的数据包。

我试过做

但我无法从用于发送数据的端口接收数据。

这就是我的监听器代码的样子(它在一个单独的线程上)(它改编自网络上的另一个教程):

这是我的发件人:

仅当用户终止应用程序时才会调用方法 server.Close()。

当我检查发送方的本地端口时,我意识到只有当接收方的本地端口“(int)e.Argument”等于发送方的本地端口时,侦听器才侦听失败。当我将接收端口设置为不同的端口时,我能够接收数据包。

此外,我无法创建更多 UdpClient 实例,因为每个 UdpClient 的本地端口都会不同,因此我将无法进行打孔。

我已经搜索了很多地方,似乎没有人有这个问题......

我相信有一个更简单的方法......

0 投票
1 回答
10814 浏览

caching - 尝试通过 Magento 的全页缓存对动态内容进行打孔

我正在使用 Magento Enterprise 1.10.1.1,需要在我们的产品页面上获取一些动态内容。我正在将当前时间插入一个块中以快速查看它是否正常工作,但似乎无法通过整页缓存。

我尝试了各种在这里找到的实现:

http://tweetorials.tumblr.com/post/10160075026/ee-full-page-cache-hole-punching http://oggettoweb.com/blog/customizations-compatible-magento-full-page-cache/ http:// /magentophp.blogspot.com/2011/02/magento-enterprise-full-page-caching.html

欢迎任何解决方案、想法、评论和建议。

这是我的代码:

app/code/local/Fido/Example/etc/config.xml

app/code/local/Fido/Example/etc/cache.xml

app/code/local/Fido/Example/Block/View.php

app/code/local/Fido/Example/Model/Container/Cachetest.php

app/design/frontend/enterprise/[mytheme]/template/example/view.phtml

来自 app/design/frontend/enterprise/[mytheme]/layout/catalog.xml 的片段

0 投票
4 回答
11210 浏览

windows - TCP 打孔

我正在尝试使用 mingw 工具链使用 Windows 套接字实现 TCP 打孔。我认为这个过程是正确的,但漏洞似乎并没有发生。我以此为参考。

  1. AB连接到服务器S
  2. S发送给A , B的路由器 IP + 它用来连接S的端口
  3. S对B做同样的事情
  4. 开始2个线程:
    • 一个线程尝试使用S发送的信息连接到B的路由器
    • 另一个线程在连接到S时正在等待连接到其路由器的同一端口上的传入连接
  5. B做同样的事情

我认为代码没有问题,因为:

  • AB确实让对方使用 ip 和 port
  • 当他们联系服务器时,他们都在监听他们用来连接路由器的端口
  • 它们都连接到正确的 ip 和端口,但超时(代码错误10060

我错过了什么?

编辑:在流程资源管理器的帮助下,我看到其中一个客户端设法建立了与对等方的连接。但是对等体似乎没有考虑建立连接。

这是我用 Wireshark 捕获的。举例来说,服务器S和客户端A在同一台 PC 上。服务器S8060侦听重定向到该 PC的特定端口 ( )。B仍然尝试在正确的 IP 上连接,因为它看到S发送的A的公共地址是,因此使用S的公共 IP 。(我已经用占位符替换了公共 IP)localhost

线鲨

编辑2:我认为混淆是由于传入和传出连接请求数据都在同一个端口上传输。这似乎弄乱了连接状态,因为我们不知道哪个套接字将从端口获取数据。如果我引用 msdn:

SO_REUSEADDRsocket 选项允许一个套接字强制绑定到另一个套接字正在使用的端口。第二个套接字调用 setsockopt,其中 optname 参数设置为SO_REUSEADDR, optval 参数设置为布尔值,TRUE然后在与原始套接字相同的端口上调用 bind。一旦第二个套接字成功绑定,绑定到该端口的所有套接字的行为都是不确定的。

但是 TCP 打孔技术需要在同一个端口上通话才能打开孔