我正在尝试在软件中实现洞穿功能,但问题是我已经使用已有的TCP服务器与用户进行通信。
这是我目前的进展:
- "A" 向UDP服务器 "US"(端口9333)发送一条消息
- "US" 返回连接到的端口(本地端口 31005)给 "A"
- "A" 向TCP服务器 "TS" 发送一条消息,表示他想要连接到 "B"(并提供端口 31000)
- "TS" 向 "B" 发送一条消息,提供 "A" 的端口(31000)和ip
- "B" 向 "US"(端口9333)发送一条消息
- "US" 返回端口45000(本地端口45005)给"B"
- "B" 向 "TS" 发送一条消息,提供它的udp端口(45000)
- "TS" 向 "A" 发送一条消息,提供 "B" 的udp端口(45000)和ip
- "A" 开始向B的ip地址的45000端口发送udp消息,并在本地端口31005上侦听
- "B" 开始向A的ip地址的31000端口发送udp消息,并在本地端口45005上侦听
当然,端口号31000、31005、45000和45005仅作为示例,每次新连接都会更改端口号,只有9333是静态的。
我知道这里有很多来回传递的过程,比实际需要的要多得多。事实上,我必须使用TCP服务器与两个用户进行通信,UDP服务器仅用于将用户的端口返回给自己,以便将其发送回TCP服务器。
然而,用户之间的消息没有被接收到......有人能想到原因吗?
编辑:
我已经测试过我的路由器,并使用http://nattest.net.in.tum.de/test.php测试了udp打洞,一切正常,所以问题不是来自于我的路由器,而是协议...
当用户在同一个NAT之后时,一切正常,当然它使用了私有IP,但这意味着代码也在工作,因此每个想法都导致协议问题...
编辑2:
事实上,我让它半工作(实际上问题来自于我的代码,而不是协议...我连接了两个用户,一个使用iPhone的3G,另一个在我的NAT后面的Wifi上。
有趣的(好吧并不是那么有趣)是,只有一个套接字能够在两个用户之间接收和发送数据。(由iPhone发起的套接字)根据协议,我应该有2个完全连接的套接字,没错吧?
所以,我设法在我的NAT中打洞,但实际上没有在蜂窝网络NAT中打洞。
当然,我立即测试了两个通过3G连接的iPhone。没有人能够从另一个iPhone获得消息。
我对蜂窝网络NAT有所遗漏吗?
P.S.:很抱歉一直在更新我的问题,但由于没有得到答案,我正在尽力自己找...
P.S.2:由于我已经成功地在我的NAT中打洞,因此我已更改标题,添加“在3G上”
编辑3:我再次运行了http://nattest.net.in.tum.de/test.php测试,使用我的电脑通过iPhone的3G连接上网。
这是结果:
显然,在第9个测试中所有udp打洞测试都成功了。
此外,似乎:
UDP绑定测试(?):端点独立绑定,端口预测很容易。
因此,在3G连接上连接两个对等方不应该有任何问题(那就不比在“家庭”NAT后面更麻烦)...我说得对吗?
编辑4:
为了确保,我现在向两个不同的UDP服务器发送消息,以检查3G上的端口和本地端口是否相同。
长话短说,当连接到两个服务器时,端口(本地和公共)是相同的。因此,对于udp而言是端点独立的,所以我想进行穿孔也没有任何问题...(至少从我的ISP来看)