Y
yqlqq
Unregistered / Unconfirmed
GUEST, unregistred user!
最近尝试做一个P2P的通信项目,无可避免要碰到两个客户端处于不同的局域网里面的问题,于是查阅了大量的相关资料,其实关于UDP穿透NAT的原理我想应该大家都了解,我就简单的说说吧!
Server
┌─────────┴─────────┐
NAT1 NAT2
│ │
Client1 Client2
说明:
Server 是服务端,放在有公网IP的机器上
Client1 是客户端1,在局域网NAT1里
Client2 是客户端2,在局域网NAT2里
那么,Client1 如何与 Client2 进行P2P的通信呢,根据我的理解,我想原理应该是以下这几个步骤:
1、Client1 登录 Server, Server 记录 Client1 的IP及PORT(IP1:Port1)
2、Client2 登录 Server, Server 记录 Client2 的IP及PORT(IP2:Port2)
3、Client1 发命令到 Server 取得 Client2 的IP及PORT
4、Client1 发包给(IP2:Port2) 即 Client2,打开一个洞用于接受 Client2 发来的包
5、Client1 发命令到 Server 让 Server 发包到 Client2 告知 Client2,Client1 的IP及PORT,并命令 Client2 发包到 Client1
6、Client2 收到 Server 发的来包后,发包到 Client1, 同时打开一个泂接受 Client1 发来的包
通过以上的六个步骤,Client1 与 Client2 已经实现了 P2P 的连接了,这是我理解的实现原理,本人接触网络编程才不久,如果理解有误,恳请指正。
原理弄清楚了以后,我马上就用Indy9里的IdUDPServer控件做了个测试,结果到最后一步,也就是 Client2 向 Client1 发包的时候,Client1 马上出现 Socket Error # 10054 错误,无法实现 P2P 连接,我再仔细的检查了代码,完全符合以上原理,但经过多次的测试,还是一样出现错误,郁闷啊!
不知大富翁里有没有那位高手有实现过相关功能的项目呢,希望能指点一下,无限感谢!
Server
┌─────────┴─────────┐
NAT1 NAT2
│ │
Client1 Client2
说明:
Server 是服务端,放在有公网IP的机器上
Client1 是客户端1,在局域网NAT1里
Client2 是客户端2,在局域网NAT2里
那么,Client1 如何与 Client2 进行P2P的通信呢,根据我的理解,我想原理应该是以下这几个步骤:
1、Client1 登录 Server, Server 记录 Client1 的IP及PORT(IP1:Port1)
2、Client2 登录 Server, Server 记录 Client2 的IP及PORT(IP2:Port2)
3、Client1 发命令到 Server 取得 Client2 的IP及PORT
4、Client1 发包给(IP2:Port2) 即 Client2,打开一个洞用于接受 Client2 发来的包
5、Client1 发命令到 Server 让 Server 发包到 Client2 告知 Client2,Client1 的IP及PORT,并命令 Client2 发包到 Client1
6、Client2 收到 Server 发的来包后,发包到 Client1, 同时打开一个泂接受 Client1 发来的包
通过以上的六个步骤,Client1 与 Client2 已经实现了 P2P 的连接了,这是我理解的实现原理,本人接触网络编程才不久,如果理解有误,恳请指正。
原理弄清楚了以后,我马上就用Indy9里的IdUDPServer控件做了个测试,结果到最后一步,也就是 Client2 向 Client1 发包的时候,Client1 马上出现 Socket Error # 10054 错误,无法实现 P2P 连接,我再仔细的检查了代码,完全符合以上原理,但经过多次的测试,还是一样出现错误,郁闷啊!
不知大富翁里有没有那位高手有实现过相关功能的项目呢,希望能指点一下,无限感谢!