我正在尝试在软件中实现打孔功能。问题是,我正在使用一个已经制作好的 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 打孔测试在第 9 次测试中都成功了。
似乎更进一步:
UDP绑定测试(?):端点独立绑定,端口预测很容易
因此,通过 3G 连接连接 2 个对等点应该不会有任何问题(远不及“家庭”NAT 后面)......我说的对吗?
编辑 4:
为了确定,我现在向两个不同的 UDP 服务器发送一条消息,以检查 3G 上的端口和本地端口是否相同。
长话短说,在两台服务器上连接时,端口(本地和公共)是相同的。所以在 EDIT 2 上完成的测试是正确的,udp 是独立于端点的,所以我猜打孔应该没有任何问题......(至少与我的 ISP 一样)