更改多播组的限制以加入 DatagramChannel?

Change the limit of multicast groups to join for DatagramChannel?

我的 DatagramChannel 无法加入超过 20 个多播组。它在第 21 次尝试时抛出 java.net.SocketException: No buffer space available 异常。

我的代码:

DatagramChannel channel = DatagramChannel.open(StandardProtocolFamily.INET);
channel.setOption(StandardSocketOptions.IP_MULTICAST_LOOP, false);
channel.setOption(StandardSocketOptions.IP_MULTICAST_TTL, 16);
channel.setOption(StandardSocketOptions.SO_REUSEADDR, true).bind(new InetSocketAddress(50051));
channel.configureBlocking(false);
            
NetworkInterface ni = getNetworkInterface("my_ni");
    
for (int i = 1; i < 200; i+=2) {
     InetAddress groupToListen = InetAddress.getByName("xxx.xxx.x." + i);
     channel.join(groupToListen, ni);
     System.out.println("Joined: " + groupToListen.toString());
}

我尝试增加发送和接收缓冲区:

channel.setOption(StandardSocketOptions.SO_RCVBUF, Integer.MAX_VALUE);
channel.setOption(StandardSocketOptions.SO_SNDBUF, Integer.MAX_VALUE);

但没有用。是的,我看到缓冲区大小已增加 但我能够加入的组数保持不变

限制适用于每个进程,所以如果我启动上述测试应用程序的 10 个实例,给它加入不超过 20 个组,在每种情况下都可以。

有什么建议可以提高这个限制吗? 提前致谢!

万一以后有人需要这个:

这是 /proc/sys/net/ipv4/igmp_max_memberships 可调参数。 我的默认值为 20 - 与我能够加入的组数完全匹配。

增加这个参数解决了这个问题。