java - 在 Java 和 Ubuntu 中从双网卡接收 UDP

标签 java ubuntu networking udp broadcast

我有 2 UDP 广播 服务器,地址为 192.168.1.1,向 192.168.1.255:1234 广播,地址 192.168.2.1 向广播>192.168.2.255:1235。 我有一个必须接收所有数据包的客户端。 这是 java 中的简单代码:

final DatagramSocket socket1, socket2;
    socket1 = new DatagramSocket(1234);
    socket2 = new DatagramSocket(1235);
    final DatagramPacket p = new DatagramPacket(new byte[10], 10);
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                try {
                    socket1.receive(p);
                    System.out.println(p.getAddress());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
    new Thread(new Runnable() {
        @Override
        public void run() {
            while (true) {
                try {
                    socket2.receive(p);
                    System.out.println();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

问题是 java 应用程序无法从 Ubuntu 中的两个 NIC 接收信息。它始终从 192.168.2.255 (eth1) 接收。所有数据包都可以使用wireshark转储,但java无法接收它们。
此外,当我在 TinyCore 发行版中使用完全相同的 java 代码时,从两个网卡接收数据包都没有问题。
Ubuntu 中的 Java 有什么问题?

最佳答案

如果要绑定(bind)特定地址,需要指定:

socket1 = new DatagramSocket(1234, InetAddress.getByName("192.168.1.255"));
socket2 = new DatagramSocket(1235, InetAddress.getByName("192.168.2.255"));

此外,您不应该在两个线程中使用相同的 DatagramPacket 实例,因为它们肯定会共享缓冲区,并且在并发数据包的情况下,结果是不可预测的。

关于java - 在 Java 和 Ubuntu 中从双网卡接收 UDP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30094691/

相关文章:

java - Spring Boot + React CORS 问题,没有 spring security

java - servlet 线程的数据库连接?

linux - 如何更新minikube最新版本?

c# - 通过网络运行 .net 应用程序

c++ - ns2 中的段错误

java - java中的迭代器类型(弱一致性)

java - Java 中非最终对象同步的正确方法

python-3.x - 激活python virtualenv后如何自动运行shell脚本?

ubuntu - 将 Ubuntu 14.04.5 LTS 中的 Solr 6.5.1 安装到自定义目录中

c++ - 读句柄问题