我正在尝试编写一个将由三个类继承的抽象类:
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。
答案 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);
}
}