社区
C++ 语言
帖子详情
UDP打洞成功却只有一方可以收到信息
哈的卜
2009-03-14 06:43:30
急急急!!
做了个p2p的程序,就是有Client A与Client B都在自己的NAT设备上为对方打好洞,却只有Client A可以接收到B发过来的信息,而B却无法接收到A的信息,B只能接Server发过来的信息,各位有遇到过类似的情况吗
请高手指教,不胜感激
...全文
235
6
打赏
收藏
UDP打洞成功却只有一方可以收到信息
急急急!! 做了个p2p的程序,就是有Client A与Client B都在自己的NAT设备上为对方打好洞,却只有Client A可以接收到B发过来的信息,而B却无法接收到A的信息,B只能接Server发过来的信息,各位有遇到过类似的情况吗 请高手指教,不胜感激
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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怎么会需要你打洞?
猫已经找不回了
2009-03-14
打赏
举报
回复
当方可接收,是不是防火墙的问题?
UDP
打洞
(
成功
打洞
)
本文介绍了
UDP
打洞
的基本原理及其实现过程,包括为何需要
UDP
打洞
、不同NAT类型的影响以及如何通过服务器中转建立两个内网客户端之间的直接通信。
UDP
打洞
(
UDP
Hole Punching)原理
本文介绍了
UDP
打洞
(
UDP
Hole Punching)原理,包括NAT的四种类型:Full Cone、Restricted Cone、Port Restricted Cone和Symmetric。重点讲解了在Cone NAT下如何利用
UDP
打洞
进行通信,并详细阐述了
打洞
的过程,以及同一NAT后的情况。最后对比了
UDP
打洞
与TCP
打洞
的区别。
udp
打洞
,c++实现,Nat
本文档展示了如何使用C++实现
UDP
打洞
和NAT穿越技术。通过定义不同消息类型,如登录、注销、P2P通信等,程序实现了客户端与服务器之间的交互。客户端可以发送消息给服务器,请求与其他客户端建立P2P连接,服务器
收到
请求后会转发相应
信息
,从而完成
UDP
打洞
过程。此外,代码中还包括了客户端之间的P2P消息传递和
打洞
命令的处理。
网络穿透:TCP
打洞
、
UDP
打洞
与 UPnP
现代网络中,很多设备处于 NAT 或防火墙后,网络穿透技术很重要。本文介绍了三种常用网络穿透技术,包括 TCP
打洞
、
UDP
打洞
和 UPnP,阐述了它们的定义、工作原理,并给出示例代码,这些技术能提高 P2P 应用在特定环境下的连接
成功
率。
udp
打洞
实现p2p在不同局域网下直接通信
本文介绍了如何利用
UDP
打洞
技术实现P2P在不同局域网下的直接通信。首先讲解了NAT类型及其对穿透的影响,接着详细阐述了实现
UDP
打洞
的两个步骤:在服务器上注册双方IP地址和开始
UDP
打洞
过程。通过这样的方法,即使在对称型NAT下,也能实现点对点通信。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章