ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java-为什么DatagramSocket不通过多播地址通过网络发送?

2019-11-18 15:03:31  阅读:281  来源: 互联网

标签:sockets networking java multicast


以下代码仅对我本地有效.我可以在另一个程序的同一台计算机上接收它.我在Wireshk中看不到任何流量(在Windows上).如果将多播地址更改为现有的地址(如10.10.10.10),那么我会在Wireshark中看到UDP数据包.

在Wireshark中,我使用过滤器udp.port ==5353.我可以看到到组播地址的其他一些数据包,我认为我的Wireshark设置是正确的.

防火墙已禁用.

public static void main( String[] args ) throws Exception {
    byte[] buf = "some data".getBytes();
    DatagramSocket socket = new DatagramSocket();
    InetAddress address = InetAddress.getByName( "224.0.0.251" );
    socket.send( new DatagramPacket( buf, buf.length, address, 5353 ) );
}

编辑:原因似乎是回送适配器(Microsoft LoopbackadapterfürKM-TEST).如果我删除回送适配器,那么它将起作用.在另一个系统上,有一个VMware适配器可能会产生平等问题.

为什么数据包没有发送到所有网络适配器?如何将其发送到正确的适配器?

解决方法:

在发送单播数据报时,路由表规定使用哪个网络接口发送数据包.对于多播,您需要指定接口.您可以使用MulticastSocket做到这一点.

假设您要发送的接口的IP为10.10.10.1,则可以执行以下操作:

public static void main( String[] args ) throws Exception {
    byte[] buf = "some data".getBytes();
    MulticastSocket socket = new MulticastSocket();
    socket.setNetworkInterface(NetworkInterface.getByInetAddress(
                                 InetAddress.getByName( "10.10.10.1" )));
    InetAddress address = InetAddress.getByName( "224.0.0.251" );
    socket.send( new DatagramPacket( buf, buf.length, address, 5353) );
}

标签:sockets,networking,java,multicast
来源: https://codeday.me/bug/20191118/2028876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有