我尝试从以前添加到接口的别名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
期间不会抛出错误。
有人能解决这个问题吗?
2条答案
按热度按时间1sbrub3j1#
IP_MULTICAST_IF与 * 接收有关。* 它与发送加入和离开消息的NIC有关,这反过来又决定了您将从 * 谁那里接收多播。*
如果要通过特定NIC或IP地址发送,请使用
bind().
t40tm48m2#
从Linux Multicast Howto:https://tldp.org/HOWTO/Multicast-HOWTO-6.html#ss6.3
6.3 IP_MULTICAST_IF。
通常,系统管理员指定默认的多播数据报发送接口。程序员可以覆盖它,并使用此选项为给定的套接字选择具体的输出接口。
从现在开始,所有在这个套接字中生成的多播流量都将从所选接口输出。要恢复到原始行为并让内核根据系统管理员的配置选择输出接口,只需使用相同的选项和接口字段中的INADDR_ANY调用setsockopt()。
在确定或选择传出接口时,以下ioctl可能很有用:SIOCGIFADDR(获取接口地址)、SIOCGIFCONF(获取所有接口的列表)和SIOCGIFFLAGS(获取接口标志,从而确定接口是否支持多播-IFF_MULTICAST标志)。
如果主机有多个接口且未设置IP_MULTICAST_IF选项,则从默认接口发送组播传输,但如果主机用作组播路由器,则其余接口可能用于组播转发。