2015-04-12 5 views
1

Regular DatagramSocket отлично работает ... ICE4J DatagramSocket, кажется, усекает данные !?ICE4J DatagramPacket слишком мал

Размер отправляемого пакета равен 2,500, но принимающий абонент всегда равен 1500 (с обычной Java DatagramSocket размер принимаемого пакета совпадает с размером отправки).

Receive Конца:

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).

ответ

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 

Мое настоящее решение - отредактировать getBufferSize до 25000, а фактические данные пакета - правильная сумма. Возможно, я попрошу слить.

+0

Ошибка за вами. Вы пытаетесь отправить неимоверно большую дейтаграмму, которая не надежно поддерживается (a) ICE4J (b) UDP (c) IP (d) Ethernet или PPPoE или независимо от вашего физического уровня. – EJP

+0

Не перечислить EJP, он не понимает протоколы UDP в Java ... Это исправление работает и было совершено в GitHub и Approved. – msj121

+0

К сожалению, вы используете StackOverflow для своего эго и не можете признать, что мой ответ правильный. Исправление для библиотеки, которая необязательно требует, чтобы пакеты составляли 1500 по спецификации Java. Если это действительно необходимо для принудительного применения, оно должно фрагментировать пакеты (что, конечно, бессмысленно, так как Java на аппаратном уровне делает это) .... – msj121

0

пакет отправки размер 25 000, но приемный конец всегда 1500

Вы никогда будет получать UDP датаграммы больше, чем путь MTU если:

  • там не является маршрутизатором между вами и мишенью и/или
  • датаграмма не фрагментирована, или
  • все фрагменты прибыли на цель.

В противном случае потеря какого-либо фрагмента приводит к потере всей дейтаграммы.

Общее допустимое ограничение на полезную нагрузку для дейтаграмм UDP составляет 534 байт. Не 25k.

+0

Вам не хватает точки ... С помощью обычного кода Java вся информация обрабатывается и передается успешно. Это код ICE4J нуждается в некоторой работе. Наконец, я добавил один дополнительный ноль, я исправлю это. К сожалению, это НЕ проблема. Если в ICE4J есть предел, который должен быть изменен imo, но 1500 не соответствует 534. – msj121

+0

Это вам не хватает. Фрагментированная датаграмма, один из фрагментов которой потерян, никогда не будет доставлен. 534 обеспечивает отсутствие фрагментации. Это гарантирует более 1500. Это базовый TCP/IP, не имеющий ничего общего с Java или конкретным программным обеспечением. – EJP

+0

Хммм ... Насколько я понимаю, пакеты датаграмм фрагментированы и скомпилированы вместе и заданы на уровне Java или они полностью пропущены ... нет такой вещи, как только получение фрагментов в Java http: // stackoverflow.com/questions/7931726/are-datagrams-always-received-полностью IMO Я доказал это, используя Java для транспортировки и показывая, что в ICE4J есть что-то конкретное, что вызывает проблему не сетевые ограничения. – msj121

Смежные вопросы