【问题标题】:JAVA - Problem receiving UDP Packets on LinuxJAVA - 在 Linux 上接收 UDP 数据包时出现问题
【发布时间】:2011-04-30 16:41:14
【问题描述】:

您好,我编写了一个简单的代码来测试我正在执行的程序。

代码在这里:

。 . .

public static final byte precond[] = {(byte) 0xFF, (byte) 0xFF, (byte) 0xFF, (byte) 0xFF};
public static final byte aftercond[] = {(byte) 0x0a,(byte) 0x00};

String msg = new String(precond) + "challenge rcon" + new String(aftercond);
      String aux = "";

      //Enviar
      DatagramSocket sc2 = new DatagramSocket(27020);
      //sc2.setSoTimeout(5000);
      DatagramPacket pkt = new DatagramPacket(msg.getBytes(),msg.length(),InetAddress.getByName("82.102.15.70"),27050);
      sc2.send(pkt);
      System.out.println("SENT");

      //Receber
      DatagramPacket pkt2 = new DatagramPacket(new byte[1024],1024);
      sc2.receive(pkt2);
      String recived = new String(pkt2.getData(),0,pkt2.getLength());
      aux = recived.split(" ")[2].trim();
      sc2.close();
      System.out.println("RECIVED - " + aux);

。 . .

这是一个简单的代码,唯一的想法就是向服务器发送一个 udp 数据包,服务器会响应。

问题是,这项工作在 Windows 上,但在 ubuntu 上不起作用(服务器/桌面版,我不是在 linux 中说,因为我还没有尝试过其他 detro)。

我已经检查了与路由器相关的所有 IPtables 但我无法解决这个问题,代码运行到第一个 System.out 然后它阻塞等待响应,但 ubuntu 上的响应从未到达:S

有人可以帮忙吗?

已经在另一台服务器 (VPS) 上尝试过,但仍然是同样的问题。

问题在于第一个数据包发送!

linux 屏幕:http://img853.imageshack.us/f/linuxr.png

Windows 屏幕:http://img339.imageshack.us/f/windowsep.png

【问题讨论】:

    标签: java linux ubuntu udp


    【解决方案1】:

    我怀疑“默认”IP 地址不同。

    您没有绑定到特定的 IP 地址,而是发送到机器的公共 IP。

    我猜在 linux 中,当你调用 DatagramSocket sc2 = new DatagramSocket(27020); 时,你会得到 127.0.0.1

    试试:

    DatagramSocket sc2 = 
        new DatagramSocket(27020, InetAddress.getByName("<my public IP here>"));
    

    【讨论】:

    • DatagramScoket的第二个参数不应该是本地IP而不是目标ip(82.102.15.70)吗?
    • 是的......我可能读错了,我以为他正在发送/接收相同的代码。已编辑……无论如何,这应该更有意义。
    • 好的,我会试一试。在 netstat 中显示的是:udp6 0 0 r1do.csrcon.info:27020 [::]:* - 如果我通过参数传递公共 IP,它仍然无法正常工作:S
    • 查看数据包数据:| linux屏幕:img853.imageshack.us/f/linuxr.pngwindows屏幕:img339.imageshack.us/f/windowsep.png
    • 如果您不指定绑定地址,您将获得 INADDR_ANY,即 0.0.0.0,即所有 NIC 地址。
    【解决方案2】:

    这可能是由于网络接口是否配置为混杂。我有一些模糊的回忆,在 linux 中,网络接口通常不会配置为混杂。如果网络接口未配置为混杂,它将不会收到自己的 udp 数据包。

    【讨论】:

    • 但是我向 IP X 发送了一个数据包,这个 ip 应该给我发回对我的数据包的响应
    【解决方案3】:

    使用Wireshark 检查实际在网络上发送和接收的内容。这应该会给你更多关于在哪里看的指示。

    【讨论】:

    • 已经做到了,但我正在使用 tcpdump,因为我的 wireshark 在 ubuntu 中找不到接口。
    • Frielspak,如果找不到接口,请确保以 root 身份运行 Wireshark(即使用sudo)。这几乎总是问题所在。
    • 我现在有打印件,我检查了问题所在。不同之处在于第一个数据包发送窗口中的字节与 unix 不同:|
    • 检查字节差异:| linux 屏幕:img853.imageshack.us/f/linuxr.png windows 屏幕:img339.imageshack.us/f/windowsep.png
    • 而不是 ff ff ff ff 63 68 61 6c ...(这是正确的字节序列),在linux中它发送 bf bd ef ..
    猜你喜欢
    • 2021-05-12
    • 2021-10-23
    • 2023-03-23
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多