Switch listener to listen to multicast, switch sender to send multicast
authorKai Blin <kai@samba.org>
Sun, 15 May 2011 12:47:16 +0000 (14:47 +0200)
committerKai Blin <kai@samba.org>
Sun, 15 May 2011 12:47:16 +0000 (14:47 +0200)
listener.c
sender.c

index 6a836a88e2a45a603300b92f637538d17b960842..5276351edd5046fdabbba0d342b89ffb3c2d20b2 100644 (file)
@@ -3,6 +3,8 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <arpa/inet.h>
+#include <net/if.h>
 #include <netdb.h>
 #include <stdio.h>
 #include <string.h>
 
 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);
 }
 
index c9fe97220acbaf78c41a7a95556709b2745aaca2..de49e1740c3b99718d4dba4afb21077ed0ecc06b 100644 (file)
--- a/sender.c
+++ b/sender.c
@@ -3,6 +3,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
+#include <net/if.h>
 #include <netdb.h>
 #include <stdio.h>
 #include <string.h>
@@ -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 <host>\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);
     }