从 Java 和 Ubuntu 中的双 NIC 接收 UDP
Receiving UDP from Dual NICs in Java & Ubuntu
我有 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 代码时,从两个 NIC 接收数据包都没有问题。
Ubuntu 中的 Java 有什么问题?
如果要绑定到特定地址,需要指定:
socket1 = new DatagramSocket(1234, InetAddress.getByName("192.168.1.255"));
socket2 = new DatagramSocket(1235, InetAddress.getByName("192.168.2.255"));
此外,您不应在两个线程中使用相同的 DatagramPacket 实例,因为它们肯定会共享缓冲区,并且在并发数据包的情况下,结果是不可预测的。
我有 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 代码时,从两个 NIC 接收数据包都没有问题。
Ubuntu 中的 Java 有什么问题?
如果要绑定到特定地址,需要指定:
socket1 = new DatagramSocket(1234, InetAddress.getByName("192.168.1.255"));
socket2 = new DatagramSocket(1235, InetAddress.getByName("192.168.2.255"));
此外,您不应在两个线程中使用相同的 DatagramPacket 实例,因为它们肯定会共享缓冲区,并且在并发数据包的情况下,结果是不可预测的。