Java DatagramChannel Multicast默认为IPv6

时间:2016-08-23 22:11:08

标签: java sockets multicast

我正在尝试编写一个将由三个类继承的抽象类:

  • UDPServer
  • MulticastServer
  • TCPSERVER

MulticastServer是我遇到问题的唯一一个。截至目前,它只是UDP。收到连接后,我希望将套接字交给存储在成员Consumer<*SocketType*>中的预定义m_handler。我正在使用Selector来执行此操作。

我此时遇到的主要问题是它似乎默认为IPv6。我收到的消息是:

  

java.lang.IllegalArgumentException:IPv6套接字无法加入IPv4多播组

// m_chan is a member instance of the channel type. DatagramChannel for multicast.

if(tcpmode) // true if the generic socket type passed is ServerSocket
    ((ServerSocketChannel)m_chan).socket().bind(sa);
else{
    if(multicast) // true if the generic socket type passed is MulticastSocket
        ((DatagramChannel)m_chan).join(Inet4Address.getByName(m_host), getIPAddr());
    else
        ((DatagramChannel)m_chan).socket().bind(sa);
}

以下是getIPAddr()的代码:

static NetworkInterface getIPAddr() throws SocketException, UnknownHostException{   
    InetAddress iaddr = InetAddress.getLocalHost();     
    NetworkInterface iface = NetworkInterface.getByInetAddress(iaddr);
    return iface;
}

我尝试添加此内容:

System.setProperty("java.net.preferIPv4Stack" , "true");

无济于事。

我肯定在使用IPv4。

1 个答案:

答案 0 :(得分:0)

以下对我来说很好。当我将StandardProtocolFamily.INET更改为StandardProtocolFamily.INET6时,我只得到您描述的相同异常,所以我假设您在创建DatagramChannel时以某种方式使用了错误的选项?

public class Test {
    public static void main(String[] args) throws IOException {
        NetworkInterface ni = NetworkInterface.getNetworkInterfaces().nextElement();
        DatagramChannel server = DatagramChannel.open(StandardProtocolFamily.INET)
            .setOption(StandardSocketOptions.SO_REUSEADDR, true)
            .bind(new InetSocketAddress(5000))
            .setOption(StandardSocketOptions.IP_MULTICAST_IF, ni);
        server.join(Inet4Address.getByName("225.4.5.6"), ni);
    }
}