小弟最近在研究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();
就是客户端接不到消息,为什么??????????????

解决方案 »

  1.   

    标题写错了,失误。想用UDP打洞的,但是没实现了,就用的TCP弄的,大家快回复啊。自己顶
      

  2.   

    年复一年的问题,月复一月的发帖,日复一日的回答,
    周而复始的学习—What?Yes—P2P等下看看有没人又好的解决方案关注很久了一直都没人有好的解决办法顺便帮你顶一下
      

  3.   

    你这个NAT是谁转换的,路由器还是主机?如果是主机,是不是你的客户端要设置socket代理?
      

  4.   

    无奈了,谁有实现打洞的代码发给我一份啊,[email protected]
      

  5.   

    据我了解,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分钟内不上过门的都慰问一下吧..常联络联络才能感情升温嘛...对不~!