疯了啊先发了个帖子也是这个问题。。后来又看了些文章,说内网一台电脑上先向外网发送一个UDP包。。外网收到了这个包。。并从中得到内网中该电脑的公网IpEndPoint,通过这个IpEndPoint就可以与之通讯。
现在我得到了IpEndPoint,为什么内网里的电脑还是收不到消息呢。

解决方案 »

  1.   

    貌似是要建立好连接后,直接用那个socket才可以通讯。
      

  2.   


    请问能详细说明下吗。。我用的是UDPClient。。你是指UDPClient.client这个?
      

  3.   

    内网路由设置?做端口映射?那QQ是怎么做的。。用HTTP隧道?
      

  4.   

    内网在把消息传给服务器时。。是在NAT做了映射。。得到了公网的IP和端口。。而我服务器得到的也是这个IP和端口。
    但是我通过这个IP和端口却不能把消息发送给内网的客户端..不知道是哪里出了错
      

  5.   

    外网是不能够主动发送UDP数据包给内网机器的.因为NAT里没有映射,包来到路由器就进不去了.要想内网能够接收到数据,必须的是内网先发一个包给外网.外网收到此包,获得IP与端口,(注意:获得的端口是NAT自动分配的,并不是内网自定义启动的监听端口).有关闭时间限制.记得好像是一般是45秒以内.要确保内网能接收到外网的数据.最好是在收到内网发的包30秒内发送此包.
      

  6.   

    首先,服务器在接收对方消息时同时获得对方的IPENDPOINT,代码如下  public void StartReceive(MsgReceiverEventArgs myMsgReceiverEventArgs)
            {
                uReceiverSlot.BeginReceive(new AsyncCallback(ReceiveCallback),myMsgReceiverEventArgs);
                Thread.Sleep(System.Threading.Timeout.Infinite);
            }        /// <summary>
            /// UDPClient异步接收到指令后的函数
            /// </summary>
            /// <param name="iar"></param>
            private void ReceiveCallback(IAsyncResult iar)
            {
                IPEndPoint ipe = ipEp;
                Byte[] receiveBytes = uReceiverSlot.EndReceive(iar, ref ipe);
                string receiveMessage = Encoding.BigEndianUnicode.GetString(receiveBytes);
                if (receiveBytes.Length > 0)
                {
                    MsgReceiverEventArgs myMsgReceiverEventArgs_msg = (MsgReceiverEventArgs)iar.AsyncState;
                    myMsgReceiverEventArgs_msg.RecvMsg = receiveMessage;
                    myMsgReceiverEventArgs_msg.Ipendpoint = ipe;
                    if (OnMsgReceived != null)
                    {
                        OnMsgReceived(this, myMsgReceiverEventArgs_msg);
                    }
                }
                //重新进行接收 
                uReceiverSlot.BeginReceive(new AsyncCallback(ReceiveCallback), (MsgReceiverEventArgs)iar.AsyncState);
            }即通过ipe获得对方的IPENDPOINT,不知道这里是否有问题?然后,NAT连接超时问题,我确实没想到会这么短,- -|,因为有人说是几分钟到几小时,但如果是这个因素引起的话。。那么问题就好解决了
      

  7.   

    过ipe获得对方的IPENDPOINT没问题啊,服务器发送消息时就使用这个ipe的IP与端口发送,就能够把消息发到.
      

  8.   

    要想长期保持NAT分配的端口一直存在,我以前的做法是每隔30秒左右给对方发一个在线通知包.这样,NAT分配的端口就能一直保持下来.
      

  9.   

    谢谢。。那么这样的话。。就是NAT的问题了。。我在去试试看
      

  10.   

    就是外网只能看到NAT的IP,所以发不过去的啦
      

  11.   

     发一下 如何  UDP  循环发包代码 谢谢