使用Java DatagramChannel监听UDP数据报

时间:2016-09-27 18:46:38

标签: java nio datagram

我正在尝试绑定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())

1 个答案:

答案 0 :(得分:0)

您绑定到192.168.34.1。您只会收到发送到该界面的数据报。除非你真的知道自己在做什么,否则你应该绑定到0.0.0.0,这是通过省略 DatagramSocket参数或使用null来完成的。

关于{{1}}在构建中做到这一点的评论并不正确。