From: Kai Blin Date: Sun, 15 May 2011 12:47:16 +0000 (+0200) Subject: Switch listener to listen to multicast, switch sender to send multicast X-Git-Url: http://git.samba.org/samba.git/?p=kai%2Fmulticast.git;a=commitdiff_plain;h=a239e4477cceb9add64180919b7a7012a1d77f6e Switch listener to listen to multicast, switch sender to send multicast --- diff --git a/listener.c b/listener.c index 6a836a8..5276351 100644 --- a/listener.c +++ b/listener.c @@ -3,6 +3,8 @@ #include #include #include +#include +#include #include #include #include @@ -12,16 +14,33 @@ int main(int argc, char **argv) { - int sock6; + int err; + int sock6 = -1; struct sockaddr_in6 name6; ssize_t len6 = sizeof(name6); + struct ipv6_mreq mreq; char buf[1024]; ssize_t msg_len; sock6 = socket(AF_INET6, SOCK_DGRAM, 0); if (sock6 == -1) { perror("opening v6 listening socket"); - exit(1); + goto die; + } + + memset(&mreq, 0, sizeof(struct ipv6_mreq)); + err = inet_pton(AF_INET6, "ff02::1:3", &mreq.ipv6mr_multiaddr); + if (err < 1) { + fprintf(stderr, "failed to convert ff02::1:3 to an address\n"); + goto die; + } + mreq.ipv6mr_interface = if_nametoindex("br0"); + + err = setsockopt(sock6, IPPROTO_IPV6, IPV6_JOIN_GROUP, &mreq, + sizeof(struct ipv6_mreq)); + if (err != 0) { + perror("joining multicast group"); + goto die; } memset(&name6, 0, len6); @@ -32,7 +51,7 @@ int main(int argc, char **argv) if (bind(sock6, (struct sockaddr *) &name6, len6) == -1) { perror("binding to v6 socket"); - exit(1); + goto die; } while(true) { @@ -40,7 +59,7 @@ int main(int argc, char **argv) if (msg_len == -1) { perror("receiving data"); - exit(1); + goto die; } buf[msg_len] = '\0'; @@ -50,5 +69,12 @@ int main(int argc, char **argv) close(sock6); return 0; + +die: + + if (sock6 != -1) { + close(sock6); + } + exit(1); } diff --git a/sender.c b/sender.c index c9fe972..de49e17 100644 --- a/sender.c +++ b/sender.c @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -14,20 +15,16 @@ int main(int argc, char **argv) { int err; int sock6; + int idx = if_nametoindex("br0"); struct addrinfo hints, *ai, *pai; - if (argc < 2) { - fprintf(stderr, "Usage: %s \n", argv[0]); - exit(2); - } - memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_INET6; hints.ai_socktype = SOCK_DGRAM; hints.ai_flags = 0; hints.ai_protocol = 0; - err = getaddrinfo(argv[1], "5355", &hints, &ai); + err = getaddrinfo("ff02::1:3", "5355", &hints, &ai); if (err != 0) { fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err)); exit(1); @@ -39,6 +36,11 @@ int main(int argc, char **argv) continue; } + err = setsockopt(sock6, IPPROTO_IPV6, IPV6_MULTICAST_IF, &idx, sizeof(idx)); + if (err != 0) { + perror("setting default multicast interface"); + } + if (connect(sock6, pai->ai_addr, pai->ai_addrlen) != -1) { /* success, end loop */ break; @@ -48,7 +50,7 @@ int main(int argc, char **argv) } if (pai == NULL) { - fprintf(stderr, "Could not connect to %s\n", argv[1]); + fprintf(stderr, "Could not connect to %s\n", "ff02::1:3"); exit(1); }