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的原因)。
答案 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。