#include /* for type definitions */ #include /* for socket API function calls */ #include /* for address structs */ #include /* for sockaddr_in */ #include /* for printf() */ #include /* for atoi() */ #include /* for strlen() */ #include /* for close() */ #define MAX_LEN 1024 /* maximum string size to send */ #define MIN_PORT 1024 /* minimum port allowed */ #define MAX_PORT 65535 /* maximum port allowed */ static void show_socket_settings(int sock) { int loop, ttl; size_t size; size = sizeof(loop); getsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, &loop, &size); printf("IPV6_MULTICAST_LOOP(%d) = %d\n", size, loop); size = sizeof(ttl); getsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &ttl, &size); printf("IPV6_MULTICAST_HOPS(%d) = %d\n", size, ttl); } int main(int argc, char *argv[]) { int sock; /* socket descriptor */ char send_str[MAX_LEN]; /* string to send */ struct sockaddr_in6 mc_addr; /* socket address structure */ unsigned int send_len; /* length of string to send */ char* mc_addr_str; /* multicast IP address */ unsigned short mc_port; /* multicast port */ int mc_ttl=1; /* time to live (hop count) */ /* validate number of arguments */ if (argc != 3) { fprintf(stderr, "Usage: %s \n", argv[0]); exit(1); } mc_addr_str = argv[1]; /* arg 1: multicast IP address */ mc_port = atoi(argv[2]); /* arg 2: multicast port number */ /* validate the port range */ if ((mc_port < MIN_PORT) || (mc_port > MAX_PORT)) { fprintf(stderr, "Invalid port number argument %d.\n", mc_port); fprintf(stderr, "Valid range is between %d and %d.\n", MIN_PORT, MAX_PORT); exit(1); } /* create a socket for sending to the multicast address */ if ((sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP)) < 0) { perror("socket() failed"); exit(1); } show_socket_settings(sock); /* set the TTL (time to live/hop count) for the send */ if ((setsockopt(sock, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (void*) &mc_ttl, sizeof(mc_ttl))) < 0) { perror("setsockopt() failed"); exit(1); } /* construct a multicast address structure */ memset(&mc_addr, 0, sizeof(mc_addr)); mc_addr.sin6_family = AF_INET6; inet_pton(AF_INET6, mc_addr_str, &mc_addr.sin6_addr.s6_addr); mc_addr.sin6_port = htons(mc_port); printf("Begin typing (return to send, ctrl-C to quit):\n"); /* clear send buffer */ memset(send_str, 0, sizeof(send_str)); while (fgets(send_str, MAX_LEN, stdin)) { send_len = strlen(send_str); /* send string to multicast address */ if ((sendto(sock, send_str, send_len, 0, (struct sockaddr *) &mc_addr, sizeof(mc_addr))) != send_len) { perror("sendto() sent incorrect number of bytes"); exit(1); } /* clear send buffer */ memset(send_str, 0, sizeof(send_str)); } show_socket_settings(sock); close(sock); exit(0); }