C# UDP打洞 高手进。。。。。。。。。急急急
小弟最近在研究UDP打洞 但是一直不成功,希望大家指点迷津
我的思路是
客户端发送数据---服务端接受并获得客户端NAT分配的IP和端口--然后服务端使用获取到的IP和端口给客户端发送消息
但是问题出来了,服务端成功接受到消息并获取到客户端NAT分配的IP和端口,但是服务端发送消息客户端接受不到
为什么啊???????????
客户端代码:
//客户端向服务器发送消息
webws.Service1 s1 = new webws.Service1();
string ss =s1.ip();//调用WEBSERVICE上面的接受并获取客户端IP和端口的方法
int port1 = 8888;
IPAddress add1 = IPAddress.Parse("98.126.213.130");//处于公网的服务器IP
IPEndPoint ip1 = new IPEndPoint(add1, port1);
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
string temp = "你好";
byte[] b = Encoding.UTF8.GetBytes(temp);
sock.Connect(ip1);
sock.Send(b);
sock.Close();
Console.WriteLine("成功");
//从服务器接受消息
webws.Service1 s1 = new webws.Service1();
string ss =s1.send1();//调用WEBSERVICE上面的发送方法
Console.WriteLine(ss);//打印WEBSERVICE返回的成功还是失败
string str = "";
int port = 8888;
string ipadd = "192.168.0.4";//本地IP
IPAddress add = IPAddress.Parse(ipadd);
IPEndPoint ip = new IPEndPoint(add, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(ip);
s.Listen(1);
while (true)
{
Socket temp1 = s.Accept();
byte[] b1=new byte[1024];
temp1.Receive(b1);
str = Encoding.Default.GetString(b1);
Console.WriteLine(str);
temp1.Close();
}
s.Close();
就是客户端接不到消息,为什么??????????????
------解决方案--------------------
据我了解,TCP打洞貌似支持的路由器比较少..成功率有多高也也没实际测试过..
一般UDP都能NAT穿透..也比较简单...
条件:
在公网放置一服务器S.这个S必须得是在公网的..
N个路由器下的客户端程序..是不是同一台机都无所谓..这里举例A,B两个客户端.
A使用UDP连接S.S保存A的当前IP与端口号信息.B同样使用UDP连接S.S也保存B的端口号信息.这时,B想跟在线用户P2P..B向S问S现在都有谁在线.S把A的IP端口信息发给B..B想连接A做P2P.就向A的IP与端口发个包,当然,这时候A是收不到的.然后告诉S要连A.让S通知A并给B的IP端口给A..A收到S通知的BIP端口后,向此IP端口发个包,问是不是要连我.此时..B就能收到A的信息.为什么?因为B刚开始有向A发过包啊.路由器NAT正开了个口等A进来呢..然后B就可以屁颠屁颠的发信息给A..然后A也就能收到了..至此穿透打洞完成...但NAT的门不是一时开着不关的啊.那不是得有千疮百孔了....所以..为了一直开着那个洞...得定时相互关心慰问一下对方..随便你是带金带钱或都空手都无所谓了....至于要隔多久慰问一次..那你也别太懒了啊...一般30秒到1分钟内不上过门的都慰问一下吧..常联络联络才能感情升温嘛...对不~!