#include #include #include #include #include #include void usage(void) { printf(" --- Join a Multicast Group ---\n"); printf("Usage:\n"); printf("mjoin \n"); printf("example:" " host1# ./mjoin eth0 224.1.0.37\n" " host1# netstat -g\n" " host2# ping -r -I eth0 -t 1 -c 2 224.1.0.37\n"); return; } int main(int argc, char *argv[]) { struct ip_mreqn mreqn; int fd, ret; if (argc != 3) { usage(); exit(1); } /* Check arguments */ memset(&mreqn, 0, sizeof(mreqn)); mreqn.imr_ifindex = if_nametoindex(argv[1]); if (!mreqn.imr_ifindex){ printf("Error: invalid interface\n"); usage(); exit(1); } ret = inet_pton(AF_INET, argv[2], &mreqn.imr_multiaddr); if (ret == 0) { printf("Error: not valid network address\n"); usage(); exit(1); } if (ret < 0) { printf("Error: not valid address family\n"); usage(); exit(1); } /* create a socket */ if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { perror("socket"); exit(1); } /* use setsockopt() to request that the kernel join a multicast group */ if (setsockopt (fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreqn, sizeof(mreqn)) < 0) { perror("setsockopt"); exit(1); } getchar(); exit(0); }