UDP 打洞的问题!

auly403 2009-06-16 11:31:24
Server 和 Client A 同一台机器!
Client B 一台机器,在同一局域网, 都没有安装防火墙之类的软件,用网上的例子,是可以打通的!。

现在的思路是
1) Client A 用 UDP connect to Server, Server 发送 client A 接收 自己的 IP 和 Port;
2) Client 用 TCP (之前TCP连接已经建立) 发自己的 IP 和 Port , 和目标 Client B 发给server;
3) server TCP 发送 Client A 的IP 和PORT 给 Client B ;
4) Client B 启用 UDP connect to server; (有数据包通信的)
5)Client B 用 UDP 给 client A 发送数据包.( 此地址是 Server 传过来的IP 和PORT) // 这里。,用 iris 监视
可以看到数据包,并且IP 和 port 都是正确!但 client A 无法收到 client B 的数据包

请问现在我的问题出在哪里?
是打洞的步骤出了问题!
还是程序的其他问题?
...全文
188 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
denglxjmm123 2009-08-06
  • 打赏
  • 举报
回复
同意楼上的说法
路人乙2019 2009-06-23
  • 打赏
  • 举报
回复
A发送两个消息,一个告诉SERVER要B向自已打洞,一个向B的地址打洞(仅仅是建立一个出去的通道映射).server告诉B A的地址后,B向这个地址打洞,路由器不会拦掉出去的消息,这时A中和B中都有了一个通道映射,这样才可以通信了.
auly403 2009-06-23
  • 打赏
  • 举报
回复
我把 PROT 和 ADDRESS 通过UDP来传送,成功,中间也可能是其他代码,改动过!
现在也不打算确定原因在哪里。或许也没有这个必要吧!
一样的模式能打通即可!
okmnji79513 2009-06-23
  • 打赏
  • 举报
回复
server 和 A 同一台机 ,B另一机 ,并且 Server、 A、 B在同一局域网,这里面 有打洞吗?同一局域网都收不到数据??
fluke 2009-06-22
  • 打赏
  • 举报
回复
和svr的通信是否和TCP有关我没有确认,我想应该无关的,但是我觉得应该保证自己bind一个端口来和svr进行通信,因为NAT应该是通过源MAC+源port来创建session的(这种是CONE NAT,最常见的)。

整个打洞的过程,楼上应该说的很清楚。A和svr通信是为了NAT上面有自己的session,B也是。

两个session都建立的同同时,尝试从svr上面获取对方的ip:port,获取到以后就互相发送消息(这个时候可以穿过NAT了)。

这个东西我刚研究,也许有错。欢迎指正。
jaron05447 2009-06-20
  • 打赏
  • 举报
回复
再加上一个限制:
NAT设备必须满足如下一个条件:对外的连接,如果源MAC,PORT一样,在NAT上就不会开启新的端口,直接利用原有端口。。只有很少的NAT不是这样。



对内的数据包转发规则:只有源ip,源端口在NAT上有记录了,才向内部机器转发。(记录的过程,就是你的最后一步,就是自己给自己打洞,然后别人用那个洞钻进去。)



PS:就是因为打洞的时候,我还是用得那个原有端口,所以在NAT上不会产生一个新的port,所以后面进洞的时候,直接使用服务器发过来的洞口就可以直接进去了。。

这点非常关键。
jaron05447 2009-06-20
  • 打赏
  • 举报
回复
看了下。。你是把洞打通了,但是你没有继续下去啊。。

少了一步:
Client B 用 UDP 给 client A 发送数据包 这个步骤,只是在B的NAT上打了个洞,到达A的NAT后,查询不到你的ip/port记录,会被丢弃的。。

到此已经基本成功了。。加上一步:
Client A隔段时间后,想Client B的NAT上发数据。。 由于洞已经打通了,数据道道B的NAT后,会有A的IP/PORT记录,然后UDP包就会被转发到Client A。。


原则就是:A连接B,就是B先发数据给A,在自己那边打个洞,然后A在发数据给B,通过那个洞就进去了。。
CodeMasterShiller 2009-06-19
  • 打赏
  • 举报
回复
http://blog.csdn.net/overmaker/archive/2008/11/01/3201799.aspx

这个是我见过的最详细的中文资料
auly403 2009-06-16
  • 打赏
  • 举报
回复
局域网 都不通过WWW也不行吧! 一步一步走呀!

既然大家都认为TCP 惹了问题,我搞个全UDP 通信的试试,
本来就想偷这个懒,
凭预感,与TCP无关的! 那我把这个IP 和 Port 用 UDP 传吧。
dong364 2009-06-16
  • 打赏
  • 举报
回复
有点混乱, 一会儿UDP, 一会儿TCP, 还有放在局域网测试有意义吗, 还有NAT支持吗?
skyxie 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 auly403 的回复:]
现在在局域网测试而已,server 的TCP 存有大量的用户信息呀。
如果这样的不行话,只能再想它法了!
[/Quote]

即使是测试,server的功能也不会少吧...
可你描述的server就只干了一件事,把A的IP,PORT 告诉B
auly403 2009-06-16
  • 打赏
  • 举报
回复
而实际上,
UDP 打洞所经的历程,已经全部实现,TCP server 只作一个辅助作用而已,
所以......
而iris 可以监视到发送过来的数据包,是不是代表已经打洞成功呢?
auly403 2009-06-16
  • 打赏
  • 举报
回复
现在在局域网测试而已,server 的TCP 存有大量的用户信息呀。
如果这样的不行话,只能再想它法了!
skyxie 2009-06-16
  • 打赏
  • 举报
回复
不明白你这个是什么打洞... 感觉你的server就是把A的IP,PORT 告诉B, 其他什么作用也没有...

B 和 A在一个局域网, 而且B是直接连的A的地址, 那么A怎么会收不到B的包? 除非是A没有在那个port上listen起~
aa3000 2009-06-16
  • 打赏
  • 举报
回复
关注一下
auly403 2009-06-16
  • 打赏
  • 举报
回复
UP
laibach0304 2009-06-16
  • 打赏
  • 举报
回复
UDP就是用STUN的方法,在RFC 3489已经描述的很清楚了,自己看去吧

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧