问题标签 [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 投票
1 回答
1426 浏览

c++ - 用 boost::asio 打孔

我试图用打孔协议制作一个服务器客户端。所以我向我的服务器发送我的客户端 IP 和客户端端口,当连接第二个用户时,服务器向客户端发送另一个客户端的 Ip 和端口。因此,当我有这个时,我试图在我的两个客户端之间建立连接,但 boost::asio 出现错误

what():未找到服务已中止

这是我的代码

0 投票
1 回答
1297 浏览

c++ - 在 Windows 7 上编译 libjingle 时出错

我遵循了 libjingle 下载中包含的自述文件。安装所有 3rd 方包并运行以下命令:

锤子.bat --jobs=6 --verbose --mode=all all_programs

我收到此错误:

环境细节:

Windows 7的

蟒蛇2.7.3

scons 2.1.0

Visual C++ 2010 速成版

0 投票
1 回答
2071 浏览

java - 简单的 PHP NAT 穿透服务器脚本

我正在尝试编写一个 PHP 脚本,它可以充当“主服务器”并促进两个 Java 游戏客户端之间的 P2P 连接。我正在使用一个允许主服务器端口访问的共享网络主机。

对于初学者,我想测试主服务器和 java 客户端之间的 UDP 套接字连接。这是我的 PHP 脚本,名为“masterServer.php”

我访问 masterServer.php 以使脚本运行,并在几秒钟内启动一个简单的 Java 应用程序,该应用程序应将 UDP 数据包发送到主服务器。下面是 Java 应用程序的代码:

据我了解,PHP 服务器没有收到 UDP 数据包。该脚本不会继续通过阻塞 socket_recvfrom() 方法,并且不会将 UDP 数据包的内容写入输出文本文件。谁能帮我吗?

0 投票
1 回答
1886 浏览

networking - UDP 打孔:一个对称 NAT 和另一个非对称 NAT

我正在尝试使用打孔实现 P2P。这是流程:

  1. 两个 Peers(P1,P2) 都会向服务器 (S) 发送 1 个数据包。
  2. 服务器(S)回复两个告诉其他人 IP:PORT
  3. P1 和 P2 接收到知道其他人的外部/公共 ip:port 的 UDP 数据包。
  4. P1,P2 开始向其他对等点发送数据包公共 IP:PORT。
  5. 一旦对等方收到其他对等方的数据包,我假设该孔已打孔并将此套接字提供给我的应用程序。

我在不同的路由器上进行了测试,结果如下:

  • 当 P1 和 P2 都在非对称 NAT(全/受限锥)上时,我不会遇到任何问题。
  • 当 P1=非对称且 P2=对称时:
  • -----router-1 (Symmetric-NAT) + router-2 (non-Symmtric) = 成功
  • ---- router-3 (Symmetric-NAT) + router-2 (non-Symmtric) = *失败*

直到第四步都很好。但在第 5 步中,没有一个对等方收到其他对等方的数据包。我期待至少* '非对称 NAT 后面的对等方'会收到其他的数据包。*

有人知道发生了什么吗?

0 投票
1 回答
1167 浏览

qt - 如何在 Qt 中进行 UDP 打孔?

我在 Internet 上有一台可以发送和接收数据报的服务器。

我应该在客户端做什么才能打一个洞,以便我可以从服务器接收数据报?

0 投票
2 回答
6328 浏览

networking - 如何模拟不同的 NAT 行为

我正在使用 UDP 和 UDT 进行打孔。对于最终测试,我需要在不同的 NAT 类型(对称、全锥、受限锥、端口受限 NAT)上测试应用程序。

有什么方法可以模拟这些吗?我在这里期望的是某种虚拟框设置。我可以将PC用作路由器,以便我可以根据需要进行配置吗?

一般来说,我们如何针对不同的网络条件测试应用程序?

0 投票
4 回答
12045 浏览

c# - UDP 打孔。让服务器与客户端对话

我一直在阅读很多关于如何实现 UDP 打孔的内容,但由于某种原因,我无法使其工作。

对于那些不熟悉什么是 udp 打孔的人,这是我自己的定义:

目标是能够在服务器的帮助下在两个客户端(客户端 A 和客户端 B)之间传输数据。所以客户端 A 连接到服务器并发送它的信息。客户 B 也是如此。服务器具有必要的信息,以便客户端 A 能够向客户端 B 发送数据,反之亦然。因此,服务器将该信息提供给两个客户端。一旦两个客户端都获得了关于彼此的信息,就可以在没有服务器帮助的情况下开始在这些客户端之间发送和接收数据。

我的目标是能够做我刚才描述的事情(udp 打孔)。在这样做之前,我认为能够从服务器连接到客户端会很有帮助。为此,我计划向服务器发送有关客户端的信息。一旦服务器收到该信息,就会尝试从头开始连接到客户端。一旦我能够执行,我应该拥有开始实施真正的 udp 打孔所需的一切。

以下是我的设置方式:

在此处输入图像描述

顶部路由器将服务器和底部路由器连接到 LAN 端口。底部路由器 (NAT) 通过其 WAN 端口连接到顶部路由器。客户端计算机连接到底部路由器的 LAN 端口之一。

因此,在该连接中,客户端能够看到服务器,但服务器无法看到客户端。

所以我用伪代码做的算法是:

  • 客户端连接到服务器。
  • 客户端向服务器发送一些 UDP 包,以便在 NAT 上打开一些端口
  • 向服务器发送有关客户端正在侦听的端口的信息。
  • 一旦服务器收到该信息,就会尝试从头开始连接到客户端。

这是代码中的实现:

服务器:

客户:

由于某种原因,它工作了几次!当客户端成功在线接收数据时起作用:sending_socket.Receive(buffer);

注意事项: 如果在第二部分的服务器上我使用实例变量listner而不是创建新变量sendSocket并通过该变量发送字节,则客户端能够接收正在发送的数据。请记住,服务器的第二部分将由第二个客户端 B 实现,这就是我再次从头开始初始化变量的原因......


编辑:

这是看待同一问题的不同方式。当我初始化一个新对象而不是使用同一个对象时,客户端不会收到响应。

我有一个 UdpClient 类型的对象。我能够将该对象的数据发送给其他对等方。如果我创建另一个具有相同属性的相同类型的对象并尝试发送数据它不起作用!我可能缺少初始化一些变量。我可以通过反射设置私有变量,所以我应该没有问题。无论如何,这里是服务器代码:

客户端代码基本上将数据发送到服务器,然后等待响应:

请注意,客户端位于路由器(NAT)后面,否则我不会遇到这个问题。我想要复制 udpClient 的原因是我可以将该变量发送到另一台计算机,从而使另一台计算机能够将数据发送到客户端。

所以我的问题是 为什么原始对象listener能够发送数据但newClient不能?sending_socket.Receive(buffer);即使在服务器执行 line: 之后,客户端仍然在排队等待newClient.Send(dataToSend, dataToSend.Length);。当侦听器发送数据而不是newClient时,客户端成功接收数据。如果两个变量具有相同的目标 IP 和端口,为什么会这样?变量有何不同?

注意:如果服务器和客户端在同一个网络上,则复制工作并且变量newClient能够将数据发送到客户端。要模拟此问题,客户端必须位于 NAT(路由器)之后。这种网络的一个例子可能包括两个路由器。我们称它们为路由器 X 和路由器 Y。您还需要一个称为 S 的服务器和一个客户端 C。因此 S 可以连接到 X 的 LAN 端口之一。C 可以连接到 Y 的 LAN 端口之一。最后将 Y 的 WAN 端口连接到 X 的 LAN 端口之一。

0 投票
2 回答
14715 浏览

udp - UDP 打孔在 3G 上未通过

我正在尝试在软件中实现打孔功能。问题是,我正在使用一个已经制作好的 TCP 服务器来与用户通信。

这是我到目前为止所拥有的:

  • “A”向 UDP 服务器“US”发送消息(在端口 9333 上)
  • “US”将它连接到的端口发送回“A”(端口 31000 - 本地端口 31005)
  • “A”向 TCP 服务器“TS”发送一条消息,说他想连接到 B(并提供端口 31000)
  • “TS”向“B”发送一条消息,给他“A”的端口(31000)和ip
  • “B”向“US”发送消息(在端口 9333 上)
  • “US”向“B”发送一条消息,告诉他他的端口 45000(本地端口 45005)
  • "B" 向 "TS" 发送一条消息,给出的是 udp 端口​​ (45000)
  • “TS”向“A”发送一条消息,提供 B 的 udp 端口​​(45000)和 ip
  • “A”开始在端口 45000 上向 B 的 ip 发送 udp 消息,并在本地端口 31005 上侦听
  • “B”开始在端口 31000 上向 A 的 ip 发送 udp 消息并监听本地端口 45005

当然这里以 31000、31005、45000 和 45005 端口为例,每个新连接端口都会改变,只有 9333 是静态的。

我知道有很多来回,比它应该的要多。事实是我必须使用 TCP 服务器与两个用户进行通信,udp 服务器只是在这里将用户的端口返回给自己,以便它可以将其发送回 TCP 服务器。

但是,任何人都没有收到用户之间的消息......任何人都会知道为什么?


编辑 :

我已经用http://nattest.net.in.tum.de/test.php测试了我的路由器,并且 udp 打孔工作正常,所以问题不是来自我的路由器,而是来自我的协议......

当用户在同一个 NAT 后面时,一切正常,当然它使用私有 ip,但这意味着代码也在工作,所以每一次都会导致协议问题......


编辑 2:

实际上,我成功了一半(问题实际上来自我的代码,而不是协议......我已经连接了 2 个用户,一个在 3G 中使用 iPhone,一个在我的 NAT 后面的 Wifi 上。

有趣(当然不是那么多)的事情是,只有一个套接字能够在两个用户之间接收和发送数据。(由 iphone 发起的套接字)根据协议我应该有 2 个连接良好的套接字,我错了吗?

所以我设法在我的 NAT 上打了一个洞,但实际上没有在蜂窝 NAT 上打洞。

当然,我马上测试了 2 部 3G 连接的 iphone。没有人得到对方的信息。

我是否错过了有关蜂窝 NAT 的某些内容?

PS:很抱歉更新了这么多我的问题,但由于我没有得到答案,我试图自己找到......

PS 2:由于我设法在我的 NAT 上打了一个洞,我更改了标题,添加了“on 3G”


编辑 3:我再次运行http://nattest.net.in.tum.de/test.php测试,我的电脑通过我的 iphone 的 3G 连接连接到互联网。

结果如下: UDP打孔结果

显然所有的 udp 打孔测试在第 9 次测试中都成功了。

似乎更进一步:

UDP绑定测试(?):端点独立绑定,端口预测很容易

因此,通过 3G 连接连接 2 个对等点应该不会有任何问题(远不及“家庭”NAT 后面)......我说的对吗?


编辑 4:

为了确定,我现在向两个不同的 UDP 服务器发送一条消息,以检查 3G 上的端口和本地端口是否相同。

长话短说,在两台服务器上连接时,端口(本地和公共)是相同的。所以在 EDIT 2 上完成的测试是正确的,udp 是独立于端点的,所以我猜打孔应该没有任何问题......(至少与我的 ISP 一样)

0 投票
1 回答
165 浏览

udp - 1个端口上的UDP打孔?

我想使用 UDP 为我们系统的用户发送推送通知,但我想知道它是否可以工作?

假设我有一台具有端口的服务器,假设 UDP:8888 打开并等待连接。我的问题是:

  • 是否有可能让许多用户连接到它?(比如 HTTP 90 服务?)

  • 如果是,在客户端连接后,我将获取他的 UDP 端口号和 IP 地址 > 我可以建立从服务器到客户端 UDP 端口的新连接并向他发送一些数据吗?

谢谢 :)

0 投票
1 回答
1984 浏览

udp - 强制路由器保持空闲 UDP 端口打开

客户端打开到我的服务器的 UDP 连接,经过一段时间(10 分钟到 24 小时),服务器需要将数据发送回客户端,但发现客户端的 UDP 端口已关闭!

经过测试,我们发现客户端仍然打开了UDP端口,但是路由器(nat)可能因为不活动而关闭了端口!

有没有办法强制路由器保持 UDP 端口打开而不发送保持活动数据包?(服务器或客户端)。

ICMP 中有类似的东西吗?

谢谢你 。