A B要连接到S,肯定首先A B双方都会在本地创建一个socket, 
去连接S上的socket。创建一个socket必然会绑定一个本地端口(就算应用程序里面没写 
端口,实际上也是绑定了的,至少java确实如此),假设为8888,这样A和B才分别建立了到 
S的通信信道。接下来就需要打洞了,打洞则需要A和B分别发送数据包到对方的公网IP。但是 
问题就在这里:因为NAT设备是根据端口号来确定session,如果是UDP的socket,A B可以 
分别再创建socket,然后将socket绑定到8888,这样打洞就成功了。

解决方案 »

  1.   


    我猜测,
    udpClient.Send(内网地址); 连到的是一台服务器udpClient.Send(公网地址); 从 Internet 上绕了一圈,仍然连到了同一台服务器问题描述不够清楚,只是猜测,不承担任何责任,转帖过500与本人无关
      

  2.   

    A向B的公网IP发送一个数据包,则NAT-A能接收来自NAT-B的数据包 
    并转发给A了(即B现在能访问A了);再由S命令B向A的公网IP发送一个数据包,则 
    NAT-B能接收来自NAT-A的数据包并转发给B了(即A现在能访问B了)。 
      

  3.   

    udpClient.Send(公网地址);
    udpClient.Send(内网地址);
    就通了?真的就通了?
      

  4.   

    udpClient.Send(公网地址);
    udpClient.Send(内网地址);
    如果是拓管的服务器,从任何地方访问的都是相同的公网地址,不存在什么内网地址,只有可能存在内部局域网络(也就是速度会快点)。
    如果是你们公司的网络,那就有公网地址和内网地址区分,那么从外面Send都是公网地址+端口,然后到路由器,由路由器设置访问的指定定端口是到哪台内网的IP。如果从内部局域网访问就直接用内网IP+端口
      

  5.   

    demo:http://www.cnblogs.com/yrh2847189/archive/2007/06/20/790013.html