下面代码,是做个假设:我在NAT后边,本地先开本地3333端口。
连接服务器123.123.123.123的1111端口,NAT到的端口号是4444,假设服务器给我返回对方客户端ip 234.234.234.234和端口3333。
我再去连接对方。
到这里,按理说我本地已经向234.234.234.234:3333打洞。
可我在123.123.123.123和234.234.234.234监控时发现,我给234.234.234.234发出去的UDP,用的却是5555端口。也就是说,我这里给2个不同IP发UDP包,用的是不同的端口。这样234.234.234.234根本不知道我哪个端口对它是打开的。是我哪里弄错了?望高手指教。谢谢!private static UdpClient uc;
uc = new UdpClient(3333);
IPEndPoint iep = new IPEndPoint(IPAddress.Parse("123.123.123.123"), 1111);
byte[] bytes = Encoding.ASCII.GetBytes("conn");
uc.Send(bytes, bytes.Length, iep);IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("234.234.234.234"), 3333);
byte[] bytes2 = Encoding.ASCII.GetBytes("conn");
uc.Send(bytes2, bytes2.Length, iep2);

解决方案 »

  1.   

    Symmetric NAT: 内网主机建立一个UDP socket(LocalIP,LocalPort),当用这个socket第一次发数据给外部主机1时,NAT为其映射一个(PublicIP-1,Port-1),以后内网主机发送给外部主机1的所有数据都是用这个(PublicIP-1,Port-1),如果内网主机同时用这个socket给外部主机2发送数据,第一次发送时,NAT会为其分配一个(PublicIP-2,Port-2), 以后内网主机发送给外部主机2的所有数据都是用这个(PublicIP-2,Port-2).如果NAT有多于一个公网IP,则PublicIP-1和PublicIP-2可能不同,如果NAT只有一个公网IP,则Port-1和Port-2肯定不同,也就是说一定不能是PublicIP-1等于 PublicIP-2且Port-1等于Port-2。此外,如果任何外部主机想要发送数据给这个内网主机,那么它首先应该收到内网主机发给他的数据,然后才能往回发送,否则即使他知道内网主机的一个(PublicIP,Port)也不能发送数据给内网主机,这种NAT无法实现UDP-P2P通信。 ————————————————————
    难道我这里真的属于这种?测试了好3个地方,都这样问题,无解了?