Exception in thread "main" java.net.SocketException: error setting options

蔚落 2023-06-24 14:24 112阅读 0赞

今天在做UDP组播发送和接收数据的时候,遇到一个错误,如下:

20191223172954889.png

public static void main(String[] args) throws IOException {
Properties properties = Resources.getProperties(“src/main/resources/ftp.properties”);
System.out.println(properties.toString());
MulticastSocket multicastSocket = new MulticastSocket(66);
InetAddress[] inetAddress = InetAddress.getAllByName(properties.getProperty(“groupip”));
System.out.println(Arrays.toString(inetAddress));
multicastSocket.joinGroup(inetAddress[0]);
System.out.println(inetAddress.toString());
}

解决办法:

  1. 网上查找各种资料之后,尝试了个方法都不对。
  2. 仔细排查自己的代码发现没有错误,所以开始思考IP或者端口引起的UDP无法加入组中。
  3. 排查之后发现UDP组播IP写错了,记得组播IP是IP的D类地址,范围在224.0.0.0~239.255.255.255
  4. 组播组可以是永久的也可以是临时的。组播组地址中,有一部分由官方分配的,称为永久组播组。永久组播组保持不变的是它的ip地址,组中的成员构成可以发生变化。永久组播组中成员的数量都可以是任意的,甚至可以为零。那些没有保留下来供永久组播组使用的ip组播地址,可以被临时组播组利用。

    1. 224.0.0.0224.0.0.255为预留的组播地址(永久组地址),地址224.0.0.0保留不做分配,其它地址供路由协议使用;
    2. 224.0.1.0224.0.1.255是公用组播地址,可以用于Internet
    3. 224.0.2.0238.255.255.255为用户可用的组播地址(临时组地址),全网范围内有效;
    4. 239.0.0.0239.255.255.255为本地管理组播地址,仅在特定的本地范围内有效。

    判断一个IP地址是否为组播地址,只需要判断该地址是否在224.0.0.255(不含)到239.255.255.255之间,

      IP地址本身是一个32位的数值,即0x00000000-0xffffffff之间,所以只需判断IP对应的Long值是否大于0xE00000FF且小于等于0xEFFFFFFF即可(该方法并非原创,而是摘自与live555源代码)

     

发表评论

表情:
评论列表 (有 0 条评论,112人围观)

还没有评论,来说两句吧...

相关阅读