listener: Do multicast join after bind() and bind to INADDR_ANY on v4 master
authorKai Blin <kai@samba.org>
Tue, 14 Jun 2011 21:19:32 +0000 (23:19 +0200)
committerKai Blin <kai@samba.org>
Tue, 14 Jun 2011 21:20:05 +0000 (23:20 +0200)
listener.c

index 36c29a644f4139575a413ab2f2caa4e3388d5fb9..dc5ae88fdf515c6dcfdf33f2160423ac256d0b22 100644 (file)
@@ -43,6 +43,17 @@ static int setup_v6_socket(const char *multicast_addr,
         goto die;
     }
 
+    memset(&name6, 0, len6);
+
+    name6.sin6_family = PF_INET6;
+    name6.sin6_addr = in6addr_any;
+    name6.sin6_port = htons(port);
+
+    if (bind(sock6, (struct sockaddr *) &name6, len6) == -1) {
+        perror("binding to v6 socket");
+        goto die;
+    }
+
     memset(&mreq6, 0, sizeof(struct ipv6_mreq));
     err = inet_pton(AF_INET6, multicast_addr, &mreq6.ipv6mr_multiaddr);
     if (err < 1) {
@@ -58,16 +69,6 @@ static int setup_v6_socket(const char *multicast_addr,
         goto die;
     }
 
-    memset(&name6, 0, len6);
-
-    name6.sin6_family = PF_INET6;
-    name6.sin6_addr = in6addr_any;
-    name6.sin6_port = htons(port);
-
-    if (bind(sock6, (struct sockaddr *) &name6, len6) == -1) {
-        perror("binding to v6 socket");
-        goto die;
-    }
 
     return sock6;
 
@@ -97,11 +98,16 @@ static int setup_v4_socket(const char *multicast_addr,
     memset(&name4, 0, len4);
 
     name4.sin_family = PF_INET;
-    name4.sin_addr.s_addr = inet_addr(multicast_addr);
+    name4.sin_addr.s_addr = INADDR_ANY;
     name4.sin_port = htons(port);
 
+    if (bind(sock4, (struct sockaddr *) &name4, len4) == -1) {
+        perror("binding to v4 socket");
+        goto die;
+    }
+
     memset(&mreq4, 0, sizeof(struct ip_mreqn));
-    mreq4.imr_multiaddr = name4.sin_addr;
+    mreq4.imr_multiaddr.s_addr = inet_addr(V4_MULTICAST_ADDR);
     mreq4.imr_ifindex = if_nametoindex(iface_name);
 
     err = setsockopt(sock4, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq4,
@@ -111,11 +117,6 @@ static int setup_v4_socket(const char *multicast_addr,
         goto die;
     }
 
-    if (bind(sock4, (struct sockaddr *) &name4, len4) == -1) {
-        perror("binding to v4 socket");
-        goto die;
-    }
-
     return sock4;
 
 die: