#include #include #include #include #include #include #include #include #include #include #include int main (int argc, char **argv) { int sock; struct in_addr group, if_addr; struct sockaddr_in bind_addr; struct ip_mreq mreq; memset(&bind_addr, 0, sizeof(struct sockaddr_in)); if (argc == 1) { group.s_addr = htonl(INADDR_ALLHOSTS_GROUP); if_addr.s_addr = htonl(INADDR_LOOPBACK); } else if (argc == 3) { if (inet_aton(argv[1], &group) != 1 || !IN_MULTICAST(ntohl(group.s_addr))) err(1, "Invalid group address - %s)", optarg); if (inet_aton (argv[2], &if_addr) != 1) err(1, "Invalid interface address - %s)", optarg); } else err(1, " [group-address] [interface-ip]"); bind_addr.sin_family = AF_INET; bind_addr.sin_addr = group; if ((sock = socket (AF_INET, SOCK_DGRAM, IPPROTO_IP)) == -1) err(1, "socket failed"); memset(&mreq, 0, sizeof (struct ip_mreq)); mreq.imr_multiaddr = group; mreq.imr_interface = if_addr; if (setsockopt (sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) err(1, "setsockopt() failed"); if (setsockopt (sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) err(1, "setsockopt() 2 failed"); exit (0); }