1

常规 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 的原因)。

4

2 回答 2

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,实际数据包数据是正确的数量。也许我会要求合并。

于 2015-04-13T23:03:57.673 回答
0

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

永远不会收到大于路径 MTU 的 UDP 数据报,除非:

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

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

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

于 2015-04-12T09:38:56.500 回答