Browse Source

Revert "[master] not to bind socket in send_multicast_data function"

This reverts commit 357652de511103d95c3297ddd7536d635796dd46.

Change-Id: Ia1b2e0cd6eb23f73c8367a445c977f1671cb3d9a
leon_huang 10 years ago
parent
commit
e6328af6ec
1 changed files with 19 additions and 2 deletions
  1. 19 2
      lssdp.c

+ 19 - 2
lssdp.c

@@ -594,7 +594,24 @@ static int send_multicast_data(const char * data, const struct lssdp_interface i
         goto end;
     }
 
-    // 2. set destination address
+    // 2. bind socket
+    struct sockaddr_in addr = {
+        .sin_family      = AF_INET,
+        .sin_addr.s_addr = interface.addr
+    };
+    if (bind(fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
+        lssdp_error("bind failed, errno = %s (%d)\n", strerror(errno), errno);
+        goto end;
+    }
+
+    // 3. disable IP_MULTICAST_LOOP
+    char opt = 0;
+    if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, &opt, sizeof(opt)) < 0) {
+        lssdp_error("setsockopt IP_MULTICAST_LOOP failed, errno = %s (%d)\n", strerror(errno), errno);
+        goto end;
+    }
+
+    // 4. set destination address
     struct sockaddr_in dest_addr = {
         .sin_family = AF_INET,
         .sin_port = htons(ssdp_port)
@@ -604,7 +621,7 @@ static int send_multicast_data(const char * data, const struct lssdp_interface i
         goto end;
     }
 
-    // 3. send data
+    // 5. send data
     if (sendto(fd, data, data_len, 0, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) == -1) {
         lssdp_error("sendto %s (%s) failed, errno = %s (%d)\n", interface.name, interface.ip, strerror(errno), errno);
         goto end;