Java Media Framework всегда генерирует многоадресные пакеты с TTL = 1

StackOverflow https://stackoverflow.com/questions/2513881

  •  22-09-2019
  •  | 
  •  

Вопрос

Мне нужно сгенерировать многоадресный аудиопоток G711, и я наткнулся на образец AVTransmit2 как часть Java Media Framework.

По сути, это работает, однако для всех многоадресных пакетов TTL установлен на 1.

Я нашел документацию, в которой говорилось, что SessionAddress может указывать значение TTL, поэтому я попытался изменить его, т.е.destAddr = новый SessionAddr(ipAddr, порт, 255);

Я также нашел несколько комментариев о том, что проблемы могут быть связаны с тем, что Java по умолчанию использует IPv6, поэтому я попытался принудительно перевести его на ipv4, запустив его следующим образом:java -djava.net.preferipv4stack = true -classpath "." Avtransmit2 javasound: // 8000 239.1.10.65 20480

Однако, глядя в Wireshark, пакеты все еще имеют TTL = 1.

Я использую JMF2.1.1e

Есть предложения, как это решить?

Это было полезно?

Решение

Это произошло примерно на шесть месяцев позже, но я нашел эту тему, пытаясь решить ту же проблему, вот что я нашел:

Я также пытался установить значение ttl при создании объектов SessionAddress, но с помощью Wireshark пакеты по-прежнему имели значение ttl, равное 1.Однако я использовал разные адреса для инициализации и цели, но настройка ttl работала, когда я использовал один и тот же адрес.Итак, если у вас есть два объекта SessionAddress, например

String addr = "239.192.1.1";
int port = 22224;
int ttl = 32;

SessionAddress multiAddress =
    new SessionAddress(InetAddress.getByName(addr), port, ttl);
SessionAddress localAddress = 
    new SessionAddress(InetAddress.getLocalHost(), SessionAddress.ANY_PORT, ttl);
SessionAddress multiAny = 
    new SessionAddress(InetAddress.getByName(addr), port, ttl);

Тогда вам придется использовать адреса следующим образом:

ХОРОШИЙ

RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(multiAddress);
rtpManager.addTarget(multiAddress);

ХОРОШИЙ

RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(multiAny);
rtpManager.addTarget(multiAddress);

ПЛОХОЙ

RTPManager rtpManager = RTPManager.newInstance();
rtpManager.initialize(localAddress);
rtpManager.addTarget(multiAddress);

РЕДАКТИРОВАТЬ:кажется, что только SessionAddress, переданный в Initialize(), должен иметь установленный ttl

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top