【发布时间】:2014-03-13 21:42:32
【问题描述】:
我正在 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 经验基本上为零,因此我们将不胜感激。
【问题讨论】:
-
我无法完全弥补你的 while 循环;
d{ii} ...行是简单的分配吗? -
是的,
d是 cell array。我所做的只是获取数据,然后根据长度trimming。我在这里使用元胞数组而不是矩阵,因为不能保证数据流的长度大小相同。 (MATLAB 仅允许您在行数相同的情况下构建矩阵。) -
只有在收到所有数据后,您能否将分配给此元胞数组的处理后处理?
-
不,如果需要,我可以在里面做。这就是我的原始代码。出于这个问题的目的,我想确保我的处理代码不是数据被丢弃的瓶颈,所以我将后处理移到了循环之外
-
啊,好的,所以即使有这段代码,你看到问题了吗?有趣...我认为增加缓冲区大小也无济于事?