首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ICE4J DatagramPacket太小

ICE4J DatagramPacket太小
EN

Stack Overflow用户
提问于 2015-04-12 08:45:23
回答 2查看 319关注 0票数 1

普通的DatagramSocket很好..。ICE4J DatagramSocket似乎截断了数据!?

发送大小为2,500,但接收端始终为1,500(对于常规的DatagramSocket,接收数据包大小与发送大小相同)。

接收端:

代码语言:javascript
复制
 Component rtpComponent = stream.getComponent(org.ice4j.ice.Component.RTCP);
 CandidatePair rtpPair = rtpComponent.getSelectedPair();
 videoDS = rtpPair.getDatagramSocket();

在线程中:

代码语言:javascript
复制
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套接字,它就能工作(当然不是在路由器后面,这就是我使用Ice4J的原因)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-13 23:03:57

我发现了首要问题..。

见org.ice4j.stack.Connector第160行

代码语言:javascript
复制
/*
* Make sure localSock's receiveBufferSize is taken into
* account including after it gets changed.
*/
int receiveBufferSize = 1500;

数据显然是截止的..。见第188行

代码语言:javascript
复制
packet.setData(
            new byte[receiveBufferSize],
            0,
            receiveBufferSize);
....
localSock.receive(packet); //line 200

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

票数 1
EN

Stack Overflow用户

发布于 2015-04-12 09:38:56

发送大小为25,000包,但接收端总是1500。

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

  • 在您和目标之间没有路由器,和/或
  • 数据报没有被分割,或者
  • 所有的碎片都到达目标。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29587593

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档