我在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经验,所以任何帮助都会受到赞赏。
答案 0 :(得分:2)
即使您的接收器错过了某些数据包(即数据报),也极不可能一致地错过255/256。您是否已经或者可以检查接收器运行时间间隔内Wirehark显示的数据包(根据需要进行过滤)?
我的猜测是你得到的seq值是错误的,因为解析数据包内容的字节顺序或对齐,你没有显示。确保接收器读取发送器用于seq的相同的两个(?)字节,并按正确的顺序 - wireshark应显示确切的布局。如果使用DataInputStream,Java将多字节数字定义为big-endian,并将所有内容定义为字节对齐;其他代码我不能说。
另外,我假设单元格赋值或'trim'操作(总是)复制字节数组的选定部分,如(可能使用)Arrays.copyOf(T [],int)。 DatagramSocket和DatagramPacket本身重复使用相同的缓冲区,因此如果在每次迭代时分配getData()引用,你将有N个指针全部到一个缓冲区,它只包含最后一次接收后的数据