java – 为什么我的MulticastSocket只接收每个第256个数据包?

我在MATLAB中订阅了一个多播UDP流.这不能完成本地,所以我使用
java.net.MulticastSocket对象.每个UDP分组都标记有一些元数据,特别是序列计数.每次我的数据源发送UDP数据包时,该序列计数都会递增.

这是我的骨架代码:

s = java.net.MulticastSocket(50001);
s.setSoTimeout(15000);
s.setReuseAddress(1);
s.setReceiveBufferSize(32768);
s.joinGroup(java.net.InetAddress.getByName('239.255.0.4'));
p = java.net.DatagramPacket(zeros(1, 1600, 'int8'), 1600);

ii = 1;
d = cell(10000,1);

while ii < 10000
    s.receive(p);
    d{ii} = p.getData;
    d{ii} = d{ii}(1:p.getLength);

    ii = ii + 1;
end

一旦我捕获了所有数据,我就可以对其进行后期处理;那一点并不重要.

在捕获这样的10,000个数据包后,我查看了序列计数,结果发现我丢失了数据包.这还算公平;毕竟这是UDP,因此无法保证收到流量.然而,真正有趣的是我只收到每个第256个数据包:

sequenceCnt =
    ...
    56637
    56893
    57149
    57405
    57661
    57917
    58173
    58429
    58685
    58941
    59197
    59453
    ...

我有Wireshark运行并观察数据流进来,数据包肯定在递增.所以我的计算机完整地看到了多播流(即不丢弃数据包,因为UDP不保证传送),但是这个小的MATLAB / Java代码无法跟上流.

知道发生了什么事吗?我基本上没有Java经验,所以任何帮助将不胜感激.

最佳答案 即使您的接收器错过了一些数据包(数据报),也极不可能一致地错过255/256.您是否已经或者可以检查接收器运行的时间间隔内Wirehark显示的数据包数量(根据需要进行过滤)?

我的猜测是你得到的seq值是错误的,因为解析数据包内容的字节顺序或对齐,你没有显示.确保接收器读取发送器用于seq的相同的两个(?)字节,并按正确的顺序 – wireshark应显示确切的布局.如果使用DataInputStream,Java将多字节数字定义为big-endian,并将所有内容定义为字节对齐;对于其他代码,我不能说.

此外,我假设单元格分配或“修剪”操作(总是)复制字节数组的选定部分,如(可能使用)Arrays.copyOf(T [],int). DatagramSocket和DatagramPacket本身重复使用相同的缓冲区,因此如果在每次迭代时分配getData()引用,您将有N个指针全部到一个缓冲区,该缓冲区仅包含上次接收后的数据.

点赞