diff options
author | Rob Taylor <robtaylor@floopily.org> | 2006-12-06 14:33:54 +0000 |
---|---|---|
committer | Wim Taymans <wim.taymans@gmail.com> | 2006-12-06 14:33:54 +0000 |
commit | 21c9ac41a9bf2f8105337d881f3c3f502ff9e71d (patch) | |
tree | 64105c626cb5df07ef2e76c6f748a47157849a24 /gst/udp/gstudpsrc.c | |
parent | 93663539f753d8eff21ba89bda54836851ba64e0 (diff) |
gst/udp/gstudpsrc.c: If using multicast in udpsrc, bind to the multicast address rather than
Original commit message from CVS:
Patch by: Rob Taylor <robtaylor at floopily dot org>
* gst/udp/gstudpsrc.c: (gst_udpsrc_start):
If using multicast in udpsrc, bind to the multicast address rather than
IN_ADDR_ANY.
This allows the simultanous use of multiple udpsrcs listening on
different multicat addresses. Without this all udpsrcs will receive all
packets from all subscribed multicast addresses.
Fixes #383001.
Diffstat (limited to 'gst/udp/gstudpsrc.c')
-rw-r--r-- | gst/udp/gstudpsrc.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/gst/udp/gstudpsrc.c b/gst/udp/gstudpsrc.c index 23e2721e..d90efade 100644 --- a/gst/udp/gstudpsrc.c +++ b/gst/udp/gstudpsrc.c @@ -652,8 +652,11 @@ gst_udpsrc_start (GstBaseSrc * bsrc) fcntl (WRITE_SOCKET (src), F_SETFL, O_NONBLOCK); #endif + if (!inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) + src->multi_addr.imr_multiaddr.s_addr = 0; + if (src->sock == -1) { - if ((ret = socket (AF_INET, SOCK_DGRAM, 0)) < 0) + if ((ret = socket (PF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0) goto no_socket; src->sock = ret; @@ -667,7 +670,11 @@ gst_udpsrc_start (GstBaseSrc * bsrc) memset (&src->myaddr, 0, sizeof (src->myaddr)); src->myaddr.sin_family = AF_INET; /* host byte order */ src->myaddr.sin_port = htons (src->port); /* short, network byte order */ - src->myaddr.sin_addr.s_addr = INADDR_ANY; + + if (src->multi_addr.imr_multiaddr.s_addr) + src->myaddr.sin_addr.s_addr = src->multi_addr.imr_multiaddr.s_addr; + else + src->myaddr.sin_addr.s_addr = INADDR_ANY; GST_DEBUG_OBJECT (src, "binding on port %d", src->port); if ((ret = bind (src->sock, (struct sockaddr *) &src->myaddr, @@ -675,13 +682,12 @@ gst_udpsrc_start (GstBaseSrc * bsrc) goto bind_error; } - if (inet_aton (src->multi_group, &(src->multi_addr.imr_multiaddr))) { - if (src->multi_addr.imr_multiaddr.s_addr) { - src->multi_addr.imr_interface.s_addr = INADDR_ANY; - if ((ret = setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, - &src->multi_addr, sizeof (src->multi_addr))) < 0) - goto membership; - } + if (src->multi_addr.imr_multiaddr.s_addr) { + src->multi_addr.imr_interface.s_addr = INADDR_ANY; + if ((ret = + setsockopt (src->sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, + &src->multi_addr, sizeof (src->multi_addr))) < 0) + goto membership; } len = sizeof (my_addr); |