40 #ifndef IPV6_ADD_MEMBERSHIP
41 #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
42 #define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
57 #define UDP_TX_BUF_SIZE 32768
58 #define UDP_MAX_PKT_SIZE 65536
61 struct sockaddr *addr)
63 #ifdef IP_MULTICAST_TTL
64 if (addr->sa_family == AF_INET) {
65 if (setsockopt(sockfd, IPPROTO_IP, IP_MULTICAST_TTL, &mcastTTL,
sizeof(mcastTTL)) < 0) {
71 #if defined(IPPROTO_IPV6) && defined(IPV6_MULTICAST_HOPS)
72 if (addr->sa_family == AF_INET6) {
73 if (setsockopt(sockfd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, &mcastTTL,
sizeof(mcastTTL)) < 0) {
84 #ifdef IP_ADD_MEMBERSHIP
85 if (addr->sa_family == AF_INET) {
88 mreq.imr_multiaddr.s_addr = ((
struct sockaddr_in *)addr)->sin_addr.s_addr;
89 mreq.imr_interface.s_addr= INADDR_ANY;
90 if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, (
const void *)&mreq,
sizeof(mreq)) < 0) {
96 #if HAVE_STRUCT_IPV6_MREQ && defined(IPPROTO_IPV6)
97 if (addr->sa_family == AF_INET6) {
98 struct ipv6_mreq mreq6;
100 memcpy(&mreq6.ipv6mr_multiaddr, &(((
struct sockaddr_in6 *)addr)->sin6_addr),
sizeof(
struct in6_addr));
101 mreq6.ipv6mr_interface= 0;
113 #ifdef IP_DROP_MEMBERSHIP
114 if (addr->sa_family == AF_INET) {
117 mreq.imr_multiaddr.s_addr = ((
struct sockaddr_in *)addr)->sin_addr.s_addr;
118 mreq.imr_interface.s_addr= INADDR_ANY;
119 if (setsockopt(sockfd, IPPROTO_IP, IP_DROP_MEMBERSHIP, (
const void *)&mreq,
sizeof(mreq)) < 0) {
125 #if HAVE_STRUCT_IPV6_MREQ && defined(IPPROTO_IPV6)
126 if (addr->sa_family == AF_INET6) {
127 struct ipv6_mreq mreq6;
129 memcpy(&mreq6.ipv6mr_multiaddr, &(((
struct sockaddr_in6 *)addr)->sin6_addr),
sizeof(
struct in6_addr));
130 mreq6.ipv6mr_interface= 0;
141 int type,
int family,
int flags)
146 const char *node = 0, *service =
"0";
149 snprintf(sport,
sizeof(sport),
"%d", port);
152 if ((hostname) && (hostname[0] !=
'\0') && (hostname[0] !=
'?')) {
155 memset(&hints, 0,
sizeof(hints));
159 if ((error =
getaddrinfo(node, service, &hints, &res))) {
168 const char *hostname,
int port)
174 if (res0 == 0)
return AVERROR(EIO);
183 int *addr_len,
const char *localaddr)
187 int family = AF_UNSPEC;
189 if (((
struct sockaddr *) &s->
dest_addr)->sa_family)
190 family = ((
struct sockaddr *) &s->
dest_addr)->sa_family;
195 for (res = res0; res; res=res->
ai_next) {
196 udp_fd = socket(res->ai_family, SOCK_DGRAM, 0);
197 if (udp_fd > 0)
break;
204 memcpy(addr, res->ai_addr, res->ai_addrlen);
205 *addr_len = res->ai_addrlen;
221 char sbuf[
sizeof(int)*3+1];
228 return strtol(sbuf,
NULL, 10);
250 char hostname[256], buf[10];
262 p = strchr(uri,
'?');
307 char hostname[1024], localaddr[1024] =
"";
308 int port, udp_fd = -1, tmp, bind_ret = -1;
315 int reuse_specified = 0;
325 p = strchr(uri,
'?');
336 s->
ttl = strtol(buf,
NULL, 10);
351 av_strlcpy(localaddr, buf,
sizeof(localaddr));
359 if (hostname[0] ==
'\0' || hostname[0] ==
'?') {
386 bind_ret = bind(udp_fd,(
struct sockaddr *)&s->
dest_addr, len);
390 if (bind_ret < 0 && bind(udp_fd,(
struct sockaddr *)&my_addr, len) < 0)
393 len =
sizeof(my_addr);
394 getsockname(udp_fd, (
struct sockaddr *)&my_addr, &len);
412 if (setsockopt(udp_fd, SOL_SOCKET, SO_SNDBUF, &tmp,
sizeof(tmp)) < 0) {
420 if (setsockopt(udp_fd, SOL_SOCKET, SO_RCVBUF, &tmp,
sizeof(tmp)) < 0) {
451 ret = recv(s->
udp_fd, buf, size, 0);
467 ret = sendto (s->
udp_fd, buf, size, 0,
471 ret = send(s->
udp_fd, buf, size, 0);