江湖救急--UDP穿NAT问题 ( 积分: 300 )

  • 主题发起人 主题发起人 Another_eYes
  • 开始时间 开始时间
A

Another_eYes

Unregistered / Unconfirmed
GUEST, unregistred user!
写了一个P2P应用, 使用UDP传送数据. clientA向server发送下载请求, server通过检测如果发现有其它client(比如clientB)具备clientA所请求的数据, 则通知ClientA到clientB进行下载, 如果没有其它client有数据则从本机提供clientA下载.
功能基本都实现了, 现在遇到一个很郁闷的问题: 如果clientA和ClientB都位于防火墙后时, clientA向server请求数据然后发觉需要重定向到clientB时则向clientB的外网ip和端口发送连接请求(设置9秒超时并每隔3秒发送一次的一个UDP包), 同时server也通知clientB clientA将要连入, 此时clientB也向clientA的外网ip和端口发送了连接请求. 根据NAT打洞的原理应该此时clientA和ClientB能建立起连接并能互相通讯了, 可是实际调试时发现它们之间无法建立连接. 不论ClientA还是ClientB都只能记录到向对方发送的UDP包但是都收不到对方的回应.
请问出现这种问题的原因是什么? 是不是我遗漏了什么?? NAT本身应该可以支持打洞技术的, 因为ClientA和ClientB能够通过QQ互相发送文件(这个应该是通过同样原理的UDP包实现的)
 
写了一个P2P应用, 使用UDP传送数据. clientA向server发送下载请求, server通过检测如果发现有其它client(比如clientB)具备clientA所请求的数据, 则通知ClientA到clientB进行下载, 如果没有其它client有数据则从本机提供clientA下载.
功能基本都实现了, 现在遇到一个很郁闷的问题: 如果clientA和ClientB都位于防火墙后时, clientA向server请求数据然后发觉需要重定向到clientB时则向clientB的外网ip和端口发送连接请求(设置9秒超时并每隔3秒发送一次的一个UDP包), 同时server也通知clientB clientA将要连入, 此时clientB也向clientA的外网ip和端口发送了连接请求. 根据NAT打洞的原理应该此时clientA和ClientB能建立起连接并能互相通讯了, 可是实际调试时发现它们之间无法建立连接. 不论ClientA还是ClientB都只能记录到向对方发送的UDP包但是都收不到对方的回应.
请问出现这种问题的原因是什么? 是不是我遗漏了什么?? NAT本身应该可以支持打洞技术的, 因为ClientA和ClientB能够通过QQ互相发送文件(这个应该是通过同样原理的UDP包实现的)
 
搬个凳子准备听课
 
我想应该首先在ClientB端的NAT里缓存有ClientA的外网IP和端口,ClientA在规定的超时时
间内,利用自己端的NAT向ClientB的外网发送连接。不过没做过NAT的东西,纯粹帮顶。
 
www.ppcn.net
上面可能有你要的资料
 
并不是所有的NAT都支持打洞的,所以有时候是需要服务器中转的!
 
我也遇到了同样的问题
我的情况好点,只有一端有防火墙,在防火墙端能发数据给我,但我无法发数据给他
是不是穿越防火墙与nat不一样呀
 
搬个凳子........
迷糊,把板凳还我
 
你可以试试利用FTP的PORT命令进行反弹
ClientB -> Server: PORT d1,d2,d3,d4,p1,p2
Server -> ClientA: 转发PORT
ClientA -> ClientB SYNC d1.d2.d3.d4:p1*256+p2
一般的NAT都支持FTP的PORT命令的
 
刚才说的是TCP的,UDP不清楚,没试过这方面应用
 
谁有用TCP的例子(能穿过Nat,FireWall)给我传一份好吗?
Tswhq@sohu.com
 
原文:同时server也通知clientB clientA将要连入, 此时clientB也向clientA的外网ip和端口发送了连接请求.

注意,对于不同的NAT(有Symmetric NAT和Cone NAT),当ClientB重连向ClientA时,其端口会有所不同,前一种NAT的端口是会改变的,这就会造成两者无法通讯。

你测试的ClientB所在的NAT应该是Symmetric NAT了。
 
还有,Nat端口存在生存期,长时间(可能是几秒)A和Server无通信,该端口即宣告无效。
所以,ClientA(ClientB)与Server之间必须发心跳包来维持NAT端口的有效性。
可能是这个原因吧
 
[:D]我知道一个好办法,徐老大,有空MSN上沟通一下撒
 
MSDN上给出的答案我觉得有可能是正确的: 是NAT未设置内网环回的原因. 因为我的ClientA 和ClientB都在同一个NAT后, 因此它们的公网IP是一样的, 不同的只是公网端口, 而即使是cone NAT也是默认不支持同一个公网IP之间的UDP穿透的.
 
另换一个问题吧, 好象我在这里看到过有这样的帖子, 可惜忘了在哪了.

怎么根据exception中的错误地址找到源代码中对应哪行? 我在.map文件中搜索出错地址, 根本就找不到, 连象一点的都没有(错误地址 - $400100后再在.map文件中查找的).
 
http://doc.4kiki.net/content/1/7/200505/01/5605d8225e4fcf2c.html
 
根据 exception中 的错误地址 找源代码的对应行,一般有3个方法.
工具准备有 W32DASM 或 IDA, 可执行文件或 DLL 大的话用前者、UE

在干净的windows 环境下(也就是重起一下机器)再执行.
反汇编(最好用IDA),找到对应的 地址.根据特征函数分析.

如果exception 发生在 内包含的单元 ,system, class 的一些函数,就稍微困难点.

如果还没搞定,明天把文件发给我, 我替你搞定.

最近在忙什么??
 
张无忌,有好办法就说出来嘛[:D]
 
后退
顶部