【问题标题】:Data Sent over UDP socket didn't Recieved未收到通过 UDP 套接字发送的数据
【发布时间】:2019-05-25 21:14:21
【问题描述】:

我是 WebRTC Android 的新手,通过使用 jStun 和下面的代码,我可以获得我的 android 设备的公共 IP 和端口。

    new Thread() {
        @Override
        public void run() {
            super.run();
            try {
                MessageHeader sendMH = new MessageHeader(MessageHeader.MessageHeaderType.BindingRequest);
                ChangeRequest changeRequest = new ChangeRequest();
                sendMH.addMessageAttribute(changeRequest);
                byte[] data = sendMH.getBytes();
                s = new DatagramSocket(4500);
                s.setReuseAddress(true);

                DatagramPacket p = new DatagramPacket(data, data.length, InetAddress.getByName("stun.l.google.com"), 19302);
                s.send(p);

                DatagramPacket rp;
                rp = new DatagramPacket(new byte[32], 32);
                //Recieve Packet from Stun Server
                s.receive(rp);

                MessageHeader receiveMH = new MessageHeader(MessageHeader.MessageHeaderType.BindingResponse);
                receiveMH.parseAttributes(rp.getData());
                final MappedAddress ma = (MappedAddress) receiveMH
                        .getMessageAttribute(MessageAttribute.MessageAttributeType.MappedAddress);

                //Show Public IP and Port On Text View
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        TextView myIp = findViewById(R.id.listeningIp);
                        TextView myPort = findViewById(R.id.listeningPort);
                        myIp.setText(ma.getAddress().toString());
                        myPort.setText(ma.getPort() + "");
                    }
                });


                while (true) {
                    byte[] b = new byte[1024];
                    DatagramPacket rr = new DatagramPacket(b, 0, b.length);
                    //This Recieve Aimed to Recieve from Laptop Packet Sender
                    s.receive(rr);
                    final String sss = new String(rr.getData());
                    Log.e("recieved", sss);

                }

            } catch (Exception e) {
                e.printStackTrace();
            }

        }
    }.start();

Android 设备的公共 IP 和端口:39.41.148.77:4500

但是当我从笔记本电脑数据包发送软件向 Android(39.41.148.77:4400) 发送数据包时,它没有收到。

感谢任何指南。谢谢

【问题讨论】:

  • 你怎么知道它没有被 B 收到? B 用来回答的代码是什么?您确定 A 发送了数据包并且 B 收到了它(例如通过 Wireshark)吗?由于它是 UDP,它可能会在您不知情的情况下丢失。
  • @SamiTahri 是的,我确定它以相同的 IP 和端口将数据包发送到 B。因为我什至尝试使用第三方软件将数据包递归发送到 Ip:Port 但在任何设备 A、B 上都没有收到
  • 可能是我错了在我告诉你他场景的方法中。当我获得两个设备的公共 IP 和端口时。我只是尝试使用第三方工具向两台设备发送数据包,但在任何设备上都没有收到。
  • 当我知道两个设备的 ip 和端口时。我试图从笔记本电脑发送带有packetsender.com 的数据包。一个接一个,但没有收到任何一个。设备 A 和 B 是 Android 设备
  • “收到”是什么意思?

标签: android webrtc stun


【解决方案1】:

完成一个已完成的 STUN 绑定请求不会突然使您的端口能够接收来自您刚刚交换数据包的公共 STUN 服务器以外的任何东西的流量。要完全打开端口,两个端点需要从同一个本地端口向彼此已知的 ip:port 对发送数据包(多次,同时)。

你需要知道的都在这里:

Programming P2P application

【讨论】:

  • 感谢您的回答。我会详细检查 P2P 应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-30
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2017-09-27
  • 2012-02-12
  • 2021-06-13
相关资源
最近更新 更多