有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Media Framework始终生成TTL=1的多播数据包

我需要生成一个G711多播音频流,在Java媒体框架中遇到了AVTransmit2示例

基本上这是可行的,但是多播数据包的TTL都设置为1

我发现一些文档表明SessionAddress可以指定一个TTL值,所以我尝试更改它,即。 destAddr=新的会话地址(IP地址,端口,255)

我还发现了一些评论,认为问题可能是由于java默认使用IPv6,所以我尝试通过如下方式启动它,将其强制使用ipv4: 爪哇-贾瓦。网preferIPv4Stack=true-classpath“AVTransmit2javasound://8000239.1.10.65 20480

然而,在wireshark中,数据包仍然具有TTL=1

我用的是JMF2。1.1e

有什么建议可以解决这个问题吗


共 (1) 个答案

  1. # 1 楼答案

    这大约晚了六个月,但我在寻找解决同样问题的方法时发现了这条线索,以下是我的发现:

    我还在创建SessionAddress对象时尝试设置ttl值,但使用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);
    

    编辑:似乎只有传递给initialize()的SessionAddress需要设置ttl