Checking multicast group membership

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;
}
This entry was posted in Uncategorized and tagged , , , , . Bookmark the permalink.

1 Response to Checking multicast group membership

  1. Pingback: FFMPEG stops receiving multicast stream after group membership lost | Asif's Blog

Leave a comment