udp hole punching(1)

这两天一直在弄UDP打洞,弄得晕头转向的。下面说说我对UDP打洞的一点理解,希望大家指点!
目标:实现两个只有内网IP地址的直接通信(不需要经过服务器的中转)
关键字:
1。NAT(网络地址解析):内网的主机向公网的服务器发送数据时,路由会利用NAT机制将内网的地址解析成公网的地址。
2。Session(会话):一个会话是由内部IpEndPoint和目的公网IpEndPoint组成的,在第一个udp包被发送出去的时候创建.
如下:如果client想向server发送一个udp数据包,在server看来client是Nath后的IpEndPoint:221.65.14.32:4000,这时Session记录了192.168.0.10:7000和60.65.54.41:5000
这样在server向221.65.14.32:4000发送数据时Nat会利用Session将数据发送到192.168.0.10:7000

------------| client |----------| Nat |-------------| server |
------------192.168.0.10:7000--------->221.65.14.32:4000------------>60.65.54.41:5000
实现udp打洞:
前提:在一段时间内,内部主机利用相同的端口向不同服务器发送UDP数据包时Nat端会分配相同的端口
也 就是说利用192.168.0.10:7000依次向server1:60.65.54.41:5000和server2:60.65.54.41: 5200发送udp数据包时,从server1和server2来看client的地址都是221.65.14.32:4000。
Server端代码:
 UdpClient firstUdp  =   new  UdpClient( 7100 );
UdpClient secondUdp 
=   new  UdpClient( 7200 );
 IPEndPoint  remote
= new  IPEndPoint(IPAddress.Any, 0 );
 
while  ( true )
{
    firstUdp.Receive(
ref remote);
    Console.WriteLine(
"First Udp Packet Come From:{0}",remote.ToString());
     secondUdp.Receive(
ref remote);
      Console.WriteLine(
"First Udp Packet Come From:{0}",remote.ToString());
       Console.WriteLine(
"===========================");

}
Client端代码:
// client,use one udpclient send each udp server a udp packet
using  System;
using  System.Collections.Generic;
using  System.Text;
using  System.Net;
using  System.Net.Sockets;

namespace  UdpTestClient
{
class Program
{
static void Main(string[] args)
{
IPAddress addr 
=IPAddress.Parse("221.198.110.220");
UdpClient client 
= new UdpClient();
byte[] bytes=System.Text.Encoding.ASCII.GetBytes("fasdf");
client.Send(bytes,bytes.Length,
new IPEndPoint(addr,7100));
Console.WriteLine(
"Just Wait five seconds...");
System.Threading.Thread.Sleep(
5000);
client.Send(bytes, bytes.Length, 
new IPEndPoint(addr, 7200));
}

}

}
相关文章
相关标签/搜索