精华内容
下载资源
问答
  • windows下UDP组播(多播)发送和接收程序

    千次下载 热门讨论 2013-01-14 10:33:09
    一个简单的C++实现UDP组播发送和接收的程序
  • 网卡接收组播问题

    2021-03-11 12:10:46
    linux环境处理方法:如果是多网卡多网段,在接收组播时有时收不到UDP包,可以考虑修改/etc/sysctl.conf文件,把 net.ipv4.conf.all.rp_filter和net.ipv4.conf.default.rp_filter设为0即可系统配置文件1. /etc/sysctl....

    linux环境处理方法:

    如果是多网卡多网段,在接收组播时有时收不到UDP包,可以考虑修改/etc/sysctl.conf文件,把 net.ipv4.conf.all.rp_filter和net.ipv4.conf.default.rp_filter设为0即可

    系统配置文件

    1. /etc/sysctl.conf

    把 net.ipv4.conf.all.rp_filter和net.ipv4.conf.default.rp_filter设为0即可

    net.ipv4.conf.default.rp_filter = 0

    net.ipv4.conf.all.rp_filter = 0

    系统启动后,会自动加载这个配置文件,内核会使用这个变量

    2. 命令行

    显示一个内核变量 sysctl net.ipv4.conf.all.rp_filter

    设置一个内核变量 sysctl -w net.ipv4.conf.all.rp_filter=0

    设置完后,会更新内核(实时的内存)中的变量的值,但不会修改sysctl.conf的值

    3. 使用/proc文件系统

    查看 cat /proc/sys/net/ipv4/conf/all/rp_filter

    设置 echo "0">/proc/sys/net/ipv4/conf/all/rp_filter

    Windows处理方法

    IP_MULTICAST_IF.

    Usually, the system administrator specifies the default interface multicast datagrams should be sent from. The programmer can override this and choose a concrete outgoing interface for a given socket with this option.

    struct in_addr interface_addr;

    setsockopt (socket, IPPROTO_IP, IP_MULTICAST_IF, &interface_addr, sizeof(interface_addr));

    >From now on, all multicast traffic generated in this socket will be output from the interface chosen. To revert to the original behavior and let the kernel choose the outgoing interface based on the system administrator's configuration, it is enough to call setsockopt() with this same option and INADDR_ANY in the interface field.

    In determining or selecting outgoing interfaces, the following ioctls might be useful: SIOCGIFADDR (to get an interface's address), SIOCGIFCONF (to get the list of all the interfaces) and SIOCGIFFLAGS (to get an interface's flags and, thus, determine whether the interface is multicast capable or not -the IFF_MULTICAST flag-).

    If the host has more than one interface and the IP_MULTICAST_IF option is not set, multicast transmissions are sent from the default interface, although the remainding interfaces might be used for multicast forwarding if the host is acting as a multicast router.

    虽然使用上面的参数以期望来绑定IP 甚至采用bind动作也没能成功, 唯一的方法还是调整组播的缺省路由。

    下面几个命令非常有用:

    查看当前各个网卡有那些在绑定的组播IP

    netsh interface ip show joins

    查看路由表

    route print

    添加路由

    route add destinationmask subnetmask gateway metriccost metric if interface

    示例:   route add 224.0.0.0 mask 240.0.0.0 192.168.50.186

    展开全文
  • 问题描述:在笔记本电脑上跑多服务,偶现收不到客户端发送的多信息,重启服务就可以收到了。 知识点:单:与某个人聊天 多:群聊 (多IP地址...故怀疑是多网卡问题,因为笔记本电脑当时有线网卡和无...

     

    知识点:单播:与某个人聊天      多播:拉了个群进行群聊  (多播IP地址就是D类IP地址,即224.0.0.0至239.255.255.255之间的IP地址)  广播:类似微信群发     可以这么简单理解,具体大家另行了解。

    问题描述:在笔记本电脑上跑多播服务,偶现收不到客户端发送的多播信息,关闭其中一个不用网卡重启服务就可以收到了

    问题分析:通过抓包,发现客户端发送的多播消息已经到了笔记本电脑上,只是多播服务没有收到。证明网络是通的,并且多播客户端已经成功发送消息。

    故怀疑是多网卡问题,因为笔记本电脑当时有线网卡和无线网卡同时在运行,而多播服务默认监听其中一个网卡A,当多播客户端通过另一个网卡B发送消息时,

    则多播服务无法收到消息。

      MulticastSocket ds=null;
            DatagramPacket packet = null;
            // 存储发来的消息
            byte[] buf = new byte[1024];
            try {
                //使用多播
                ds = new MulticastSocket(10007);
                InetAddress   receiveAddress=InetAddress.getByName("239.106.106.255");
                ds.joinGroup(receiveAddress);
                packet = new DatagramPacket(buf, buf.length);
                while (true) {
                    ds.receive(packet);
                    buf = Arrays.copyOfRange(packet.getData(), 0, packet.getLength());
                    //消息处理
                   // parse(packet.getAddress(), buf);
                }
            } catch (Exception e) {
               logger.error("寻址监听出错",e);
            } finally {
                ds.close();
    查看 InetAddress.getByName("239.106.106.255")的源码 如下图:

     

    可以确定原来的代码确实只监听了默认的网卡地址。

     

    解决方案:1、多播服务监听所在服务器(电脑)的所有有效网卡地址。

                      2、多播客户端发送其所有有效网卡地址。

     

    我是做服务端的,毫无疑问选择的是方案一。

    实现过程

      public void start() throws Exception {
    
            MulticastSocket ds = null;
            DatagramPacket packet = null;
            // 存储发来的消息
            byte[] buf = new byte[1024];
            try {
                //使用多播
                ds = new MulticastSocket(10007);
                InetAddress  receiveAddress=InetAddress.getByName("239.106.106.255");
                //默认网卡监听
                //  ds.joinGroup(receiveAddress);
                //获取有效网卡地址
                List<NetworkInterface> addressList = NetworkUtil.getNetworkInterfaces();
                //端口不冲突就行
                int port = 10009;
                for (NetworkInterface networkInterface : addressList) {
                    InetSocketAddress inetSocketAddress = new 
                    InetSocketAddress(receiveAddress, port);
                    //将有效网卡加入组播
                    ds.joinGroup(inetSocketAddress, networkInterface);
                    port++;
    
                }
                packet = new DatagramPacket(buf, buf.length);
                while (true) {
                    ds.receive(packet);
                    buf = Arrays.copyOfRange(packet.getData(), 0, packet.getLength());
                   //消息处理
                  //  parse(packet.getAddress(), buf);
                }
            } catch (Exception e) {
                logger.error("寻址监听出错", e);
            } finally {
                ds.close();
            }
        }
    public class NetworkUtil {
        private final static String LOCAL_IP = "127.0.0.1";
        /**
         * 获取本机有效所有网卡地址
         *
         * @return  List<NetworkInterface> ip列表
         * @throws
         */
        public static List<NetworkInterface> getNetworkInterfaces() throws Exception {
            List<NetworkInterface> localIPlist = new ArrayList<NetworkInterface>();
            Enumeration<NetworkInterface> interfs = 
            NetworkInterface.getNetworkInterfaces();
            if (interfs == null) {
                return null;
            }
            while (interfs.hasMoreElements()) {
                NetworkInterface interf = interfs.nextElement();
                Enumeration<InetAddress> addres = interf.getInetAddresses();
                while (addres.hasMoreElements()) {
                    InetAddress in = addres.nextElement();
                    if (in instanceof Inet4Address) {
                        if (!LOCAL_IP.equals(in.getHostAddress())){
                            localIPlist.add(interf);
                        }
                    }
                }
            }
            return localIPlist;
        }
    
    }
    

    问题验证:验证网卡是否加入多播组

            windows:   执行   netsh interface ipv4 show joins

            Linux:  执行 netstat  -g

    我的是windows,如图:可以看出有线网卡和无线网卡都加入了多播组。至此问题解决

    展开全文
  • linux网络编程中,组播通信在setsockopt接口中IP_ADD_MEMBERSHIP添加组播成员。但组播成员个数有限制,默认是20个。若需要添加更多的个数,则需要修改系统配置文件。本文档给出了怎么去修改默认的组播数。
  • windows无法接收到组播问题

    千次阅读 2020-01-20 19:31:14
    应项目要求, 参与将一个设备发现服务从 linux 移植到 windows 上的过程, 设备发现服务通过加入特定的组播组,比如239.255.255.250,来监听对应组播组的发现报文,接收到目的地址为对应组播组的地址时,返回当前...

    windows上组播接收异常的问题

    应项目要求, 参与将一个设备发现服务从 linux 移植到 windows 上的过程, 设备发现服务通过加入特定的组播组,比如239.255.255.250,来监听对应组播组的发现报文,接收到目的地址为对应组播组的地址时,返回当前设备的IP地址,完成发现的流程。

    测试过程中发现, 在部分型号路由器(包括TPlink部分型号,萤石,ASUS)下, 无法进行 SADP 搜索。通过抓包发现, windows 端 win10 系统发送的均为 IGMPv3 报文, 路由器上发送的均为IGMPv2 的报文, 在客户端发送对应的 239.255.255.250 地址段的组播报文时, 路由器未转发数据包到 windows 网段, 可以认为是没能成功加入组播组。

    按照微软官网描述,在发现系统所处的环境为 IGMPv2 组播环境时, 会自动切换到以 IGMPv2, 但此时看来因某种未知原因, windows 的该机制没有生效。故而从官网上找到一种固定 windows 系统的 IGMP 版本的办法, 通过修改注册表的方式固定从网卡以 IGMPv2 的方式加入组播组, 修改完成后, 即可正常在该路由器环境下接收到 IGMP 报文。修改地址如下:

    HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\Tcpip\\Parameters
    

    截图如下:
    在这里插入图片描述

    新增 DWORD 类型的 IGMPLevel 字段为 2 , DWORD 类型的 IGMPVersion 字段为 3。

    IGMPVersion 字段中 2 表示 IGMPv1, 3 为 IGMPv2, 4 为 IGMPv3(默认)。
    IGMPLevel 字段中 0 表示不支持组播, 1 表示只支持发送 IPv4 组播, 2 表示完全支持IGMP(默认)

    参考网址:

    https://social.technet.microsoft.com/Forums/windows/en-US/0d0da348-3b8b-4790-8aa2-60740a02536f/windows-7-and-igmp-multicast

    展开全文
  • 首先,指定源组播,linux 和windows编程稍微有些不同: ... windows:bind的是接收网卡的地址(local_ip)和组播端口 对于一个网卡收流,其他网卡不用收流 现象1):组播收不到流。 原因:标...
    • 首先,指定源组播,linux 和windows编程稍微有些不同:

                       Linux:bind的是组播地址和组播端口

                       windows:bind的是接收网卡的地址(local_ip)和组播端口

    • 对于一个网卡收流,其他网卡不用收流

              现象1):组播收不到流。

                  原因:标红的语句填写的IP地址是any了,如果默认IP不是要收组播的网卡IP,就会收不到流。

                  解决方法:把srcMreq.imr_interface.s_addr 改成本地IP,即可收到流。

        struct ip_mreq_source srcMreq;
        srcMreq.imr_multiaddr.s_addr = inet_addr(muticast_ip.c_str());//组播地址
        srcMreq.imr_interface.s_addr = inet_addr(local_ip.c_str());//本地网卡的地址
        srcMreq.imr_sourceaddr.s_addr = inet_addr(src_ip.c_str());//组播的指定源地址
        if (0 > setsockopt(h_sock, IPPROTO_IP, IP_ADD_SOURCE_MEMBERSHIP, (char*)&srcMreq, sizeof(srcMreq)))
        {
            cout << "setsockopt IP_ADD_SOURCE_MEMBERSHIP failed, ";
            return false;
        }

             现象2) :可以收到组播流,但是接收一段时间,就收不到了。时间一般是路由器配置查询器的时间的2倍。

                    原因:网卡未添加组播路由,所以没有持续发IGMP包,所以路由器查询后,发现没有端口收流,就不继续往端口发流了

                     解决方法:route add -net 0.0.0.0 netmask 0.0.0.0 dev eth0

    • 其次:对于要多网卡收流

            现象描述:

                        网卡1(192.168.100.71) :可以收到组播地址的流(source 192.168.100.150);网卡2(192.168.1.171):收不到组播地址的流(source 192.168.100.150)

                       原因: 网卡2发送不了IGMP的包,原因1.171不知道里没有100.150的路由,所以不知道往哪里发送,解决方法:route add -net 192.168.100.150 netmask 255.255.255.255 dev enp1s0f2,这样网卡2可以收到组播包,但是网卡1收不到组播包了。

                       因此要想多网卡都接收组播流,配置路由就不行了。

                       我还尝试了 sysctl -w net.ipv4.conf.all.rp_filter=2,当把所有网卡的的内核参数都设置2后,网卡enp1s0f2可以收到流了,但是收一段时间后,流就停了,用tcpdump -i enp1s0f2 igmp  -l -n -vv 观察,enp1s0f2仅仅收到交换机发送的igmp查询包,却没有enp1s0f2发送的IGMP的包(只有刚开始加入组的时候有两个IGMP的包,正常情况应该是加入的时候发送两个IGMP包,然后每隔一段时间,再发送一个IGMP包)。

                        后来运行下面的命令,就可以多网卡收流:

                         sysctl -w net.ipv4.conf.all.rp_filter=0
                        cat /proc/sys/net/ipv4/conf/all/rp_filter

                        切记:有几个网卡,就要执行几次sysctl -w net.ipv4.conf.网卡名.rp_filter=0,每个网卡执行一下次

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------

    •     rp_filter参数详细介绍

                    rp_filter参数有三个值,0、1、2,具体含义:

                     0:不开启源地址校验。

                     1:开启严格的反向路径校验。对每个进来的数据包,校验其反向路径是否是最佳路径。如果反向路径不是最佳路径,  则直接丢弃该数据包。

                     2:开启松散的反向路径校验。对每个进来的数据包,校验其源地址是否可达,即反向路径是否能通(通过任意网口),如果反向路径不同,则直接丢弃该数据包

                 

               如上所示,数据包发到了eth1网卡,如果这时候开启了rp_filter参数,并配置为1,则系统会严格校验数据包的反向路径。从路由表中可以看出,返回响应时数据包要从eth0网卡出,即请求数据包进的网卡和响应数据包出的网卡不是同一个网卡,这时候系统会判断该反向路径不是最佳路径,而直接丢弃该请求数据包。(业务进程也收不到该请求数据包)

                    解决办法:

                    1.修改路由表,使响应数据包从eth1出,即保证请求数据包进的网卡和响应数据包出的网卡为同一个网卡。

                    2.关闭rp_filter参数。(注意all和default的参数都要改)

                                   1)修改/etc/sysctl.conf文件,然后sysctl -p刷新到内存。

                                   2)使用sysctl -w直接写入内存:sysctl -w net.ipv4.conf.all.rp_filter=0

                                  3)修改/proc文件系统: echo "0">/proc/sys/net/ipv4/conf/all/rp_filter

                     rp_filters参数介绍来自https://www.cnblogs.com/lipengxiang2009/p/7446388.html

        多网卡收同一个组播流,当rp_filter=0时,每个网卡上收到两份数据
                 

       把socket绑定网卡,让socket接收到该网卡的网络包

        struct ifreq Ifreq;
        strcpy(Ifreq.ifr_name, "eth0"); //这里指定使用那块网卡拉流 参数为网卡名称

        if (setsockopt(h_sock, SOL_SOCKET, SO_BINDTODEVICE, (char *)&Ifreq, sizeof(Ifreq)) < 0)
        {
            perror("setsockopt():SO_BINDTODEVICE");
            return false;
        }

     

    展开全文
  • 组播的时候到底该如何绑定网卡

    千次阅读 2014-09-01 16:47:56
    以前在代码中,遇到组播都是一直绑定0.0.0.0然后去把自己加入到组播组里面去。但是最近的一次改动却让我发现了一个问题。 因为在显示的环境中机器上会有很多网卡(>3)。 而我们指向接收其中一个子网中的组播中的...
  • 在unix中,组播通信时,IP_ADD_MEMBERSHIP时可通过ip_mreq::imr_interface.s_addr指定接口地址,在windows中采用WSAJoinLeaf如何指定接口地址? 指定接口地址的目的是发送时,通过指定的IP发送出去,不由系统...
  • 虚拟网卡导致的组播不通 很多搞代码的童鞋,会在windows上安装虚拟机捣鼓各种Linux神技。很长一段时间,爽并舒服着,突然有一天蛋疼的问题找上门了:写的组播程序怎么也通不了,程序检查了一遍又一遍,头发抓掉一把...
  • 有谁遇到过同样问题的可以探讨下,或者已经解决问题的,能够指导下我获取组播锁private InetAddress group;WifiManager wm=(WifiManager)getSystemService(Context.WIFI_SERVICE);MulticastLock mlock=wm....
  • 网卡访问慢问题在服务器端很可能引发一系列程序BUG问题。 目录 Windows路由表详解 ...Windows服务器双网卡网络慢的问题 路由表重复问题 可能存在路由表重复问题 重复路由解决方法 服务器...
  • GNS3+虚拟机VMWare模拟组播实验这个组播实验捣鼓了好久哦,终于看到现象了,感谢网友的各种技术文档,没有你们的分享,我也完不成这个实验!实验环境:虚拟机VMWare,里面装2003真机PC是XPGNS3核心点就是使用win03/...
  • 项目需求需要在windows2008 r2的环境上搭建虚拟机Linux系统,并用Linux系统接收组播数据。在windows2008 r2搭建虚拟机,已经介绍过了。关键的地方在与,桥接网卡,静态IP要设置好。 组播是基于IP/TCP协议簇下的多播...
  • 关于WIN7 双网卡 问题

    千次阅读 2014-09-26 15:53:48
    3.对组播不是很了解啊,只知道,大家可以加入到组播组,然后其中一方发一个数据包到该组播组,大家都能收到,不像P2P需要重复发送多次。只能搜了。 4.找了一天解决方案,都没找到,后来还是同事找了个ROUTE的方案...
  • win10下socket收不到udp组播数据

    千次阅读 2020-03-27 16:11:30
    win10下socket收不到udp组播数据
  • Windows系统下的组播发送 //==============send.h================== #ifndef SEND_H_ #define SEND_H_ #include <string> #include <WinSock.h> //windows 网络的函数所在的头文件 using namespace ...
  • 随着互联网的迅猛发展,网络应用大量增加,尤其视频数据的传输量庞大。通过优化带宽可满足数据传输量...IP组播的必备条件IP组播的设备支持组播源和组播组成员及其两者之间的底层网络都必须支持组播,具体条件如下...
  • 网络直播,如何跳出组播的坑!

    万次阅读 2016-07-23 09:10:33
    互联网上的直播,其数据传输方式都采用“单播”方式,所以大家在讨论直播技术时,少有人提及“组播”这个词。 然而,作为直播的组成部分,在广电有线电视、IPTV等应用中,“组播”依然承担着十分重要的作用。本文...
  • c UDP-实现广播/组播

    2021-02-08 16:57:12
    /* 使用本地任意IP添加组播组 */ group.imr_ifindex = if_nametoindex("eth0"); /* 通过网卡名-->编号 ip ad */ setsockopt(confd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &group, sizeof(group));/* 设置client 加入多...
  • 关于组播通信失败,大概率因为多网卡,通过ipconfig可以查看具体网卡情况。C:\WINDOWS\system32>ipconfig无线局域网适配器 WLAN:连接特定的 DNS 后缀 . . . . . . . :本地链接 IPv6 地址. . . . . . . . : fe80::...
  • 但是平时的上网还是用的无线网卡。所以学习一下,产生了这个需求来。百度上都是可以搜索到的。此处做个笔记,记录一下 开始之学习一下网络的基础知识 IP 地址的构成 1.IP 地址是由网络位 和 主机位构成 网络位如果...
  • Windows 10 家庭是一种小型局域网网络文件共享解决方案,其在 Windows 中存在已久。使用家庭可以让本地网络中的任意 Windows 10 设备方便地访问到其它 PC 上所的共享文件和打印机等资源,说得直白一点就是其使用...
  • IPv4、IPv6地址、组播地址及子网掩码详解一 一、IPv4地址 1、IP地址的定义 IP地址是分配给IP网络中每台机器的数字标识符,它指出了设备在网络中的具体位置。由 32 位二进制数组成。IP地址是软件地址,而不是硬件地址...
  • 增加组播路由

    千次阅读 2011-09-01 20:13:00
     使用route 命令添加的路由,机器重启或者网卡重启后路由就失效了,方法:  //添加到主机的路由  # route add –host 192.168.168.110 dev eth0  # route add –host 192.168.168.119 gw 192.168.168.1  //...
  • c/c++:UDP(udp通信、广播、组播),本地套接字

    千次阅读 多人点赞 2019-12-28 17:33:33
    目录 1. udp 1.1 udp通信流程 1.2操作函数 send、sendto recv、recvfrom ...3 组播 ...3.1 组播地址 ...3.2组播通信流程 ...3.3 设置组播属性函数:setsockopt 3.4 组播代码 4. 本地套接字 4.1 结构体soc...
  • 关于QT UDP组播的几个问题

    万次阅读 2016-08-09 16:24:14
    UDP组播时最好不要提客户端/服务端的概念,而是提发送端/接收端的概念,避免出现逻辑理解混乱。大家在使用QT UDP时,可能会出现下面的情况:1.接收不到数据1.1 代码不对我看有些文章会这样写:m_udpSocket = new ...
  • 第3章管理WindowsServer2008用户和1小时57分钟18节 3-1管理用户10:56 3-2用户的SID和用户的身份09:34 3-3禁用管理员02:29 3-4创建隐藏账户08:56 3-5创建不属于管理员的管理员06:54 3-6使用密码重设盘恢复密码06:...
  • 路由表是Windows的TCP/IP协议栈的一个重要的部分。但是,路由表不是Windows操作系统向普通用户显示的东西。网管们如果要看到这个路由表,你必须要打开一个命令提示符对话框,然后...1. 使用ipconfig /all查看网卡信息
  • 在单模式下,NLB重新对每个NLB节点中启用NLB的网络适配器分配MAC地址(此MAC地址称为群集MAC地址),并且所有的NLB节点均使用相同的MAC地址(均使用群集MAC地址),同时NLB修改所有发送的数据包中的源MAC...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,859
精华内容 3,143
关键字:

windows网卡添加组播