我正在尝试绑定Java DatagramChannel以侦听特定端口和子接口上的UDP流量,但我似乎无法让它在我创建了多个虚拟网络子接口(特别是我想要的那个)的linux主机上工作听取如下所示)。如果我在相同的网络Windows PC中托管java应用程序(使用不同的IP地址,但是在这种情况下,我只需要指定监听端口以及在Windows上我不使用子接口),代码就可以了。 / p>
这是我的linux框上ifconfig的相关部分输出,显示虚拟网络适配器(子接口)
function getNumber(probabilities){
var rnd = Math.random();
var total = 0;
var hit;
for(var i = 0; i < probabilities.length; i++){
if(rnd > total && rnd < total + probabilities[i][0]){
hit = probabilities[i]
}
total += probabilities[i][0];
}
return Number((hit[1] + (Math.random() * (hit[2] - hit[1]))).toFixed(2));
}
var number = getNumber(
[
//chance, min, max
[0.4, 1, 10],
[0.2,11,20],
[0.3,21,30],
[0.1,31,35]
]
);
console.log(number);
界面设置如下:
p2p1:37: flags=4163<UP,BnetROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.34.1 netmask 255.255.0.0 broadcast 192.168.255.255
ether 00:13:72:a5:9c:e2 txqueuelen 1000 (Ethernet)
device interrupt 16
我用来初始化非阻塞DatagramChannel的代码如下所示:(我需要ifconfig p2p1:37 192.168.34.1 netmask 255.255.0.0
,因为我需要使用选择器以非阻塞方式同时从多个端口读取数据。我尝试使用端口号绑定到默认适配器,该端口号通过DatagramChannel
存储在entry.getValue()
中但没有收到任何数据包。我读到某个地方,在构造DatagramChannel之后,它默认构造一个绑定到'0.0.0.0'的数据报套接字,一旦绑定它就不能解除绑定 - 但我不确定是否有任何这种情况。任何指导都将不胜感激。
channel.socket().bind(new InetSocketAddress(entry.getValue())
答案 0 :(得分:0)
您绑定到192.168.34.1。您只会收到发送到该界面的数据报。除非你真的知道自己在做什么,否则你应该绑定到0.0.0.0,这是通过省略 DatagramSocket
参数或使用null来完成的。
关于{{1}}在构建中做到这一点的评论并不正确。