社区
C++ 语言
帖子详情
UDP打洞成功却只有一方可以收到信息
哈的卜
2009-03-14 06:43:30
急急急!!
做了个p2p的程序,就是有Client A与Client B都在自己的NAT设备上为对方打好洞,却只有Client A可以接收到B发过来的信息,而B却无法接收到A的信息,B只能接Server发过来的信息,各位有遇到过类似的情况吗
请高手指教,不胜感激
...全文
236
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
打洞
(
成功
打洞
)
个人博客:www.saoguang.top
UDP
打洞
本篇文章由zg51747708曾广 原创,未经允许不可以转载 注:本文章内的程序代码全部是在Window 10 CreaterUpdata VS2017 上测试 >>>>>>>>>>>>>>>>&
UDP
打洞
(
UDP
Hole Punching)原理
一. NAT分类根据STUN协议(RFC3489),NAT大致分为下面四类:1) Full Cone这种NAT内部的机器A连接过外网机器C后,NAT会打开一个端口.然后外网的任何发到这个打开的端口的
UDP
数据报都可以到达A.不管是不是C发过来的.例如 A:192.168.8.100 NAT:202.100.100.100 C:292.88.88.88A(192.168.8.100:5000) -> NAT(202.100.100.100:8000) -> C(292.88.88.88:2000)
udp
打洞
,c++实现,Nat
#pragma once #include // 定义iMessageType的值 #define LOGIN 1 #define LOGOUT 2 #define P2PTRANS 3 #define GETALLUSER 4 // 服务器端口 #define SERVER_PORT 6060 // Client登录时向服务器发送的消息 struct stLoginMessage {
网络穿透:TCP
打洞
、
UDP
打洞
与 UPnP
TCP
打洞
(TCP Hole Punching)是一种使 NAT 后的两个客户端通过第三方服务器建立直接连接的方法。NAT 通常会阻止外部主机直接与内部主机通信,因此需要借助外部服务器来协调连接。
UDP
打洞
(
UDP
Hole Punching)与 TCP
打洞
类似,是一种让处于 NAT 后的两台主机通过第三方服务器建立直接
UDP
连接的技术。与 TCP 不同的是,
UDP
是无连接的协议,允许 NAT 主机更容易接受来自外部的连接请求。
udp
打洞
实现p2p在不同局域网下直接通信
内网穿透的具体应用——
udp
打洞
实现p2p在不同局域网下直接通信 一、内网穿透的前提 1. 了解NAT 2.通信双方的NAT类型对穿透的影响 二、实现
UDP
打洞
进行p2p通信 1. 首先将双方NAT的IP地址注册到服务器 2. 开始
udp
打洞
总结
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章