Following code can be used to check multicast group member under Linux. This code is only for ipv4, but can be extended for ipv6.
Note: I have used netstat source as a reference to write this code.
#define PATH_PROCNET_IGMP "/proc/net/igmp" //TODO: Support ipv6 static int udp_check_multicastgroupmembership(struct sockaddr *addr) { FILE *f_igmp; char igmp_line[8192]; char target_addr[10]; int result = -1; if(addr->sa_family != AF_INET) { printf("udp.c: IPPROTO_IPV6 NOT SUPPORTED\n"); return -1; //NOT SUPPORTED } if(NULL == (f_igmp = fopen(PATH_PROCNET_IGMP, "r"))) { printf("udp.c: Unable to open %s\n", PATH_PROCNET_IGMP); return -1; } snprintf(target_addr, 9, "%X", ((struct sockaddr_in *)addr)->sin_addr.s_addr); if(fgets(igmp_line, sizeof(igmp_line), f_igmp)) { if(strstr(igmp_line, "Device") == NULL) { printf("udp.c: IPPROTO_IPV6 NOT SUPPORTED\n"); fclose(f_igmp); return -1; } } result = 0; while (!feof(f_igmp)) { if(fgets(igmp_line, sizeof(igmp_line), f_igmp)){ if(NULL != strstr(igmp_line, target_addr)){ result = 1; break; } } }; fclose(f_igmp); return result; }
Pingback: FFMPEG stops receiving multicast stream after group membership lost | Asif's Blog