C语言 如何从特定IP发送组播数据?

vm0i2vca  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(159)

我尝试从以前添加到接口的别名IP向组播组发送数据。我使用IP_MULTICAST_IF和别名IP调用setsockopt。但数据始终从该接口的默认IP发送。为了解释,我提供了一些代码。
ip addr show命令为ens33接口提供以下输出:

2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:4c:78:71 brd ff:ff:ff:ff:ff:ff
    inet 192.168.190.183/24 brd 192.168.190.255 scope global ens33
       valid_lft forever preferred_lft forever
    inet 192.168.190.50/24 scope global secondary ens33
       valid_lft forever preferred_lft forever

现在setsockopt被用作:

struct in_addr localInterface;
localInterface.s_addr = inet_addr("192.168.190.50");

    if(setsockopt(sd, IPPROTO_IP, IP_MULTICAST_IF, (char *)&localInterface, sizeof(localInterface)) < 0)
    {
        perror("Setting local interface error");
        exit(1);
    }
    else
    {
        printf("Setting the local interface...OK\n");
    }

但是,它总是从192.168.190.183发送多播数据包,并且在setsockopt期间不会抛出错误。
有人能解决这个问题吗?

1sbrub3j

1sbrub3j1#

IP_MULTICAST_IF与 * 接收有关。* 它与发送加入和离开消息的NIC有关,这反过来又决定了您将从 * 谁那里接收多播。*
如果要通过特定NIC或IP地址发送,请使用bind().

t40tm48m

t40tm48m2#

从Linux Multicast Howto:https://tldp.org/HOWTO/Multicast-HOWTO-6.html#ss6.3
6.3 IP_MULTICAST_IF。
通常,系统管理员指定默认的多播数据报发送接口。程序员可以覆盖它,并使用此选项为给定的套接字选择具体的输出接口。

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

从现在开始,所有在这个套接字中生成的多播流量都将从所选接口输出。要恢复到原始行为并让内核根据系统管理员的配置选择输出接口,只需使用相同的选项和接口字段中的INADDR_ANY调用setsockopt()。
在确定或选择传出接口时,以下ioctl可能很有用:SIOCGIFADDR(获取接口地址)、SIOCGIFCONF(获取所有接口的列表)和SIOCGIFFLAGS(获取接口标志,从而确定接口是否支持多播-IFF_MULTICAST标志)。
如果主机有多个接口且未设置IP_MULTICAST_IF选项,则从默认接口发送组播传输,但如果主机用作组播路由器,则其余接口可能用于组播转发。

相关问题