summaryrefslogtreecommitdiffstats
path: root/gst/udp/gstudpsrc.c
diff options
context:
space:
mode:
authorRob Taylor <robtaylor@floopily.org>2006-12-06 14:33:54 +0000
committerWim Taymans <wim.taymans@gmail.com>2006-12-06 14:33:54 +0000
commit21c9ac41a9bf2f8105337d881f3c3f502ff9e71d (patch)
tree64105c626cb5df07ef2e76c6f748a47157849a24 /gst/udp/gstudpsrc.c
parent93663539f753d8eff21ba89bda54836851ba64e0 (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.c24
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);