Bjoern D. Rasmussen
unread,Oct 18, 2012, 5:50:06 AM10/18/12You do not have permission to delete messages in this group
Either email addresses are anonymous for this group or you need the view member email addresses permission to view the original message
to
Anyone know how to make Linux respond to a IGMP query (IGMP_MEMBERSHIP_QUERY)? When I join a multicast group, e.g. 229.34.34.34, then Linux reports membership but when a membership query is sent to 224.0.0.1 from my IGMP switch then my Linux box doesn't say that it belongs to 229.34.34.34. This eventually results in my IGMP switch closing the membership and I need to manually report membership again.
Here's the program I've written (btw, I've forced IGMPv2 use on my Linux):
int main()
{
struct ip_mreq mreq = {0};
struct sockaddr_in localSock = {0}, peerAddr = {0};
char buff[2000], addr[100];
int ret;
socklen_t size;
int sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);
if(sd < 0)
{
perror("Opening datagram socket error");
exit(1);
}
else
printf("Opening the datagram socket...OK.\n");
localSock.sin_family = AF_INET;
localSock.sin_port = htons(4321);
localSock.sin_addr.s_addr = inet_addr("192.168.0.101");
if(bind(sd, (struct sockaddr*)&localSock, sizeof(localSock)))
{
perror("Binding datagram socket error");
exit(1);
}
else
printf("Binding datagram socket...OK.\n");
mreq.imr_multiaddr.s_addr = inet_addr("229.34.34.34");
mreq.imr_interface.s_addr = inet_addr("192.168.0.101");
if(setsockopt(sd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (char *)&mreq,
sizeof(mreq)) < 0)
{
perror("Setting local interface error");
exit(1);
}
else
printf("Setting the local interface...OK\n");
sleep(1000000);
return 0;
}
When I run the program above on a Windows7 box it re-reports memberships when the querier asks. Why doesn't it do this on Linux?
-- Bjoern