日期:2014-05-17  浏览次数:20817 次

最近在玩udp p2p通讯, 遇到一个问题, 希望有经验的朋友指点一下, 感谢
计算机A, B 分别位于NAT之后(俗称为内网), 计算机C在公网, 如下图:
A<----------->NatA<--------------->C<-------------------->NatB<------------->B

A,B向C发送消息后, C能够获取到A,B的映射IP和映射端口等信息, 因此C通过A和B映射IP、映射端口可以向A, B发送消息。
如果A需要将消息发送给B, 目前已经实现由C进行中转, 但这不符合P2P的思想,也增加了C的负载。于是希望通过C能够打通A与B的点对点连接.

参考网上一篇文章 http://andylin02.iteye.com/blog/444666, 里面有这样一句话:
"那么A要向B发送消息怎么办呢?需要C向B发送一个消息告诉B方A的地址让B向这个地址发送一个消息,对A进行一个穿透。这样A就可以向B发送消息了。"

经测试以后发送B直接使用A的映射地址和端口对其发送消息, A无法接收,  于是再搜索相关资料得知, A的映射地址和端口仅对于计算机C是有效的....

所以请教一下高手, 正确的做法是怎样的呢? 希望能分享一些经验 , 不甚感谢 .

------解决方案--------------------
    由你的描述可知:你是想借助C与A、B现有活动会话使A、B能够直接通信,这就是P2P打洞:分为UDP打洞和TCP打洞,下面讲讲UDP打滑洞:
    首先A与C有活动的UDP会话或连接,C能够看得到A的(公有IP:端口,私有IP:端口)对;同理,B也一样。
    1.A发送打洞请求C连接到B,此时C会发送B的(公有IP:端口,私有IP:端口)对响应A的同时发送A的(公有IP:端口,私有IP:端口)对给B。
    2.A同时向B的公有IP:端口和私有IP:端口发送数据包,同时B同时向A的公有IP:端口和私有IP:端口发送数据包。
    3.当向A发向B的私有IP:端口的数据包穿过自己的NatA时NatA会作记录,这时B发向A数据包到达NatA后NatA就知道该分发给谁了,同理在B的NatB处也一样,这样就打通了A与B的直接联接,就像分别在NatA和NatB上打了一个洞。
    具体过程和例子代码请参照《Windows网络与通信程序设计》第二版(作者:王艳平)的第10章。