ICE4J DatagramPacket太小了

时间:2015-04-12 08:45:23

标签: java android udp ice4j

Regular DatagramSocket工作正常...... ICE4J DatagramSocket似乎截断了数据!?

发送大小数据包为2,500,但接收端始终为1500(使用常规Java DatagramSocket,接收数据包大小与发送大小相同)。

收到结束:

 Component rtpComponent = stream.getComponent(org.ice4j.ice.Component.RTCP);
 CandidatePair rtpPair = rtpComponent.getSelectedPair();
 videoDS = rtpPair.getDatagramSocket();

在线程中:

byte[] buffer = new byte[250000000];
final DatagramPacket dp = new DatagramPacket(buffer, buffer.length);
videoDS.receive(dp);
final byte[] clone = new byte[dp.getLength()];
System.arraycopy(dp.getData(), dp.getOffset(), clone, 0, dp.getLength());
final Image image = new Image(new ByteArrayInputStream(clone));

发送方几乎相同,只不过它在Android上运行......

非工作代码之间的唯一差异在于第一段用于发送和接收。如果我使用普通的Java Socket它会工作(但当然不会在路由器后面,这就是我使用Ice4J的原因)。

2 个答案:

答案 0 :(得分:1)

我找到了首要问题......

请参阅org.ice4j.stack.Connector第160行

/*
* Make sure localSock's receiveBufferSize is taken into
* account including after it gets changed.
*/
int receiveBufferSize = 1500;

数据明显被截止....见第188行

packet.setData(
            new byte[receiveBufferSize],
            0,
            receiveBufferSize);
....
localSock.receive(packet); //line 200

我的当前解决方案是将receiveBufferSize编辑为25000,并且实际的数据包数据是正确的数量。也许我会要求合并。

答案 1 :(得分:0)

  

发送大小数据包为25,000,但接收端始终为1500

从不将收到大于路径MTU的UDP数据报,除非:

  • 您和目标之间没有路由器,和/或
  • 数据报没有碎片化,或
  • 所有碎片都到达了目标。

否则丢失任何片段都会导致丢失整个数据报。

UDP数据报的普遍接受的有效负载限制是534字节。不是25k。