UDP打洞成功却只有一方可以收到信息

哈的卜 2009-03-14 06:43:30
急急急!!
做了个p2p的程序,就是有Client A与Client B都在自己的NAT设备上为对方打好洞,却只有Client A可以接收到B发过来的信息,而B却无法接收到A的信息,B只能接Server发过来的信息,各位有遇到过类似的情况吗

请高手指教,不胜感激
...全文
235 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
andygarcia 2012-05-27
  • 打赏
  • 举报
回复
----之前我说,如果双方的NAT类型(或设置)都会对外来的不明UDP包返回一个icmp错误时(程序检测为10054错误),双方就不能实现UDP打洞,这个应该是没错的,我看网上一些人也这么说。
----但即使双方NAT都是这样的类型(或设置),我貌似找到了一个简单有效解决办法。
andygarcia 2012-05-25
  • 打赏
  • 举报
回复
----我的问题和楼主的遇到的问题好象有点不同。
----对于我的问题,我的结论是,双方首次发送后,只要任何一方recv检测到10054错误,则那一方的NAT已经禁止了该session,继续发送也没用,该session既不能接收也不能发送,打洞将会失败,这个跟NAT的处理方式有关。如果只有一方是这种情况,可以控制该方延迟首次发送,但如果双方的NAT都是这样,则UDP打洞应该不能实现。除非双方的首次发送包,总能刚好在对方首次发送后到达对方的NAT(而对方的发送包又刚好在本方发送后到达),而这是理想的“绝对同时发送”的情况,实际几乎不可能实现。
----不知道我的理解对不对。如果是这样,udp打洞其实没有网上说的那么容易实现。
andygarcia 2012-05-25
  • 打赏
  • 举报
回复
____我也试了一下udp打洞,出现你说的问题。
____我用的两个NAT不是相同的,虽然已验证过都支持ConeNAT。
____我的测试方法是,在ClientA和ClientB通过服务器同时获得对方在NAT的IP和PORT后,ClientA立即对ClientB发送数据,而ClientB则延迟1秒发送数据。然后双方进入接收状态,如果等候2秒没有接受到数据则超时继续发送。
____测试结果是,双方都没有一次能接收到对方的数据。
____但是我反过来,让ClientB首先发送数据,ClientA延迟一秒发送数据,结果双方就可以连续通信了。
____我发现在ClientA首先发送数据时,sendto后,recv会返回10054错误,就算用WSAIoctl设置了SIO_UDP_CONNRESET参数忽略该错误也是打洞不成功。而让ClientB先发送数据则不会出现10054错误。不知道是不是跟这个有关,我也想不出什么道理和解决办法。
哈的卜 2009-03-15
  • 打赏
  • 举报
回复
这两个用户都在NAT设备之后,外网是无法直接访问他们的,所以需要这俩用户主动向对方发送数据包为对方打洞之后才可以接收到对方的信息
要是防火墙阻挡了的话怎么Client B却可以接收到Server发送过来的信息呢
我也曾尝试着去把对方的防火墙关掉了,但是还是不行,Client A发送过去的数据Client B照样无法接收到,我甚至把Client A的防火墙专门打开了
但Client A还是可以接收到Client B发送过来的消息
arong1234 2009-03-14
  • 打赏
  • 举报
回复
很可能防火墙阻挡了
你正常的UDP怎么会需要你打洞?
  • 打赏
  • 举报
回复
当方可接收,是不是防火墙的问题?

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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