annotate stream/udp.c @ 24576:6704a924d4aa

According to MSDN a thread must call CoUninitialize once for each successful call it has made to CoInitialize or CoInitializeEx, including any call that returns S_FALSE. Only the CoUninitialize call corresponding to the CoInitialize or CoInitializeEx call that initialized the library can close it. patch by Gianluigi Tiesi, mplayer netfarm it
author diego
date Sun, 23 Sep 2007 20:37:33 +0000
parents 97eaba07ef9d
children a26e50cae389
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
1 /*
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
2 * Copyright (C) 2006 Benjamin Zores
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
3 * Network helpers for UDP connections (originally borrowed from rtp.c).
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
4 *
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
5 * This program is free software; you can redistribute it and/or modify
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
6 * it under the terms of the GNU General Public License as published by
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
7 * the Free Software Foundation; either version 2 of the License, or
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
8 * (at your option) any later version.
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
9 *
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
10 * This program is distributed in the hope that it will be useful,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
13 * GNU General Public License for more details.
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
14 *
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
16 * along with this program; if not, write to the Free Software Foundation,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
18 */
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
19
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
20 #include "config.h"
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
21
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
22 #include <stdlib.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
23 #include <string.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
24 #include <errno.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
25 #include <unistd.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
26 #include <stdlib.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
27 #include <sys/types.h>
19464
3f19764369ac missing header for struct timeval
rfelker
parents: 19330
diff changeset
28 #include <sys/time.h>
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
29 #include <ctype.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
30
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
31 #ifndef HAVE_WINSOCK2
19544
32cfda1ff555 Fix mingw compilation
reimar
parents: 19464
diff changeset
32 #include <netdb.h>
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
33 #include <netinet/in.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
34 #include <sys/socket.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
35 #include <arpa/inet.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
36 #define closesocket close
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
37 #else
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
38 #include <winsock2.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
39 #include <ws2tcpip.h>
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
40 #endif
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
41
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
42 #include "mp_msg.h"
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
43 #include "url.h"
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
44 #include "udp.h"
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
45
22473
011d1adc0133 optionally reuse the socket if -reuse-socket is selected; patch by Yong Hwan (sio4 users sf net) simplified by me
nicodvb
parents: 19544
diff changeset
46 int reuse_socket=0;
011d1adc0133 optionally reuse the socket if -reuse-socket is selected; patch by Yong Hwan (sio4 users sf net) simplified by me
nicodvb
parents: 19544
diff changeset
47
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
48 /* Start listening on a UDP port. If multicast, join the group. */
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
49 int
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
50 udp_open_socket (URL_t *url)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
51 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
52 int socket_server_fd, rxsockbufsz;
19330
6f58dd7a5520 kill a warning in getsockopt()
ben
parents: 19318
diff changeset
53 int err;
6f58dd7a5520 kill a warning in getsockopt()
ben
parents: 19318
diff changeset
54 socklen_t err_len;
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
55 fd_set set;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
56 struct sockaddr_in server_address;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
57 struct ip_mreq mcast;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
58 struct timeval tv;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
59 struct hostent *hp;
22473
011d1adc0133 optionally reuse the socket if -reuse-socket is selected; patch by Yong Hwan (sio4 users sf net) simplified by me
nicodvb
parents: 19544
diff changeset
60 int reuse=reuse_socket;
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
61
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
62 mp_msg (MSGT_NETWORK, MSGL_V,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
63 "Listening for traffic on %s:%d ...\n", url->hostname, url->port);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
64
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
65 socket_server_fd = socket (AF_INET, SOCK_DGRAM, 0);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
66 if (socket_server_fd == -1)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
67 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
68 mp_msg (MSGT_NETWORK, MSGL_ERR, "Failed to create socket\n");
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
69 return -1;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
70 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
71
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
72 if (isalpha (url->hostname[0]))
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
73 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
74 #ifndef HAVE_WINSOCK2
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
75 hp = (struct hostent *) gethostbyname (url->hostname);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
76 if (!hp)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
77 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
78 mp_msg (MSGT_NETWORK, MSGL_ERR,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
79 "Counldn't resolve name: %s\n", url->hostname);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
80 closesocket (socket_server_fd);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
81 return -1;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
82 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
83 memcpy ((void *) &server_address.sin_addr.s_addr,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
84 (void *) hp->h_addr_list[0], hp->h_length);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
85 #else
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
86 server_address.sin_addr.s_addr = htonl (INADDR_ANY);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
87 #endif /* HAVE_WINSOCK2 */
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
88 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
89 else
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
90 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
91 #ifndef HAVE_WINSOCK2
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
92 #ifdef USE_ATON
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
93 inet_aton (url->hostname, &server_address.sin_addr);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
94 #else
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
95 inet_pton (AF_INET, url->hostname, &server_address.sin_addr);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
96 #endif /* USE_ATON */
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
97 #else
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
98 server_address.sin_addr.s_addr = htonl(INADDR_ANY);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
99 #endif /* HAVE_WINSOCK2 */
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
100 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
101 server_address.sin_family = AF_INET;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
102 server_address.sin_port = htons (url->port);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
103
22473
011d1adc0133 optionally reuse the socket if -reuse-socket is selected; patch by Yong Hwan (sio4 users sf net) simplified by me
nicodvb
parents: 19544
diff changeset
104 if(reuse_socket && setsockopt(socket_server_fd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)))
011d1adc0133 optionally reuse the socket if -reuse-socket is selected; patch by Yong Hwan (sio4 users sf net) simplified by me
nicodvb
parents: 19544
diff changeset
105 mp_msg(MSGT_NETWORK, MSGL_ERR, "SO_REUSEADDR failed! ignore.\n");
011d1adc0133 optionally reuse the socket if -reuse-socket is selected; patch by Yong Hwan (sio4 users sf net) simplified by me
nicodvb
parents: 19544
diff changeset
106
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
107 if (bind (socket_server_fd, (struct sockaddr *) &server_address,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
108 sizeof (server_address)) == -1)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
109 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
110 #ifndef HAVE_WINSOCK2
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
111 if (errno != EINPROGRESS)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
112 #else
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
113 if (WSAGetLastError () != WSAEINPROGRESS)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
114 #endif /* HAVE_WINSOCK2 */
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
115 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
116 mp_msg (MSGT_NETWORK, MSGL_ERR, "Failed to connect to server\n");
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
117 closesocket (socket_server_fd);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
118 return -1;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
119 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
120 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
121
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
122 #ifdef HAVE_WINSOCK2
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
123 if (isalpha (url->hostname[0]))
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
124 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
125 hp = (struct hostent *) gethostbyname (url->hostname);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
126 if (!hp)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
127 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
128 mp_msg (MSGT_NETWORK, MSGL_ERR,
24558
97eaba07ef9d Fix a few typos
reimar
parents: 24026
diff changeset
129 "Could not resolve name: %s\n", url->hostname);
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
130 closesocket (socket_server_fd);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
131 return -1;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
132 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
133 memcpy ((void *) &server_address.sin_addr.s_addr,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
134 (void *) hp->h_addr, hp->h_length);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
135 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
136 else
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
137 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
138 unsigned int addr = inet_addr (url->hostname);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
139 memcpy ((void *) &server_address.sin_addr, (void *) &addr, sizeof (addr));
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
140 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
141 #endif /* HAVE_WINSOCK2 */
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
142
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
143 /* Increase the socket rx buffer size to maximum -- this is UDP */
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
144 rxsockbufsz = 240 * 1024;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
145 if (setsockopt (socket_server_fd, SOL_SOCKET, SO_RCVBUF,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
146 &rxsockbufsz, sizeof (rxsockbufsz)))
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
147 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
148 mp_msg (MSGT_NETWORK, MSGL_ERR,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
149 "Couldn't set receive socket buffer size\n");
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
150 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
151
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
152 if ((ntohl (server_address.sin_addr.s_addr) >> 28) == 0xe)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
153 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
154 mcast.imr_multiaddr.s_addr = server_address.sin_addr.s_addr;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
155 mcast.imr_interface.s_addr = 0;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
156
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
157 if (setsockopt (socket_server_fd, IPPROTO_IP,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
158 IP_ADD_MEMBERSHIP, &mcast, sizeof (mcast)))
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
159 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
160 mp_msg (MSGT_NETWORK, MSGL_ERR, "IP_ADD_MEMBERSHIP failed (do you have multicasting enabled in your kernel?)\n");
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
161 closesocket (socket_server_fd);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
162 return -1;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
163 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
164 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
165
24026
dec604030d92 Fix UDP select timeout.
diego
parents: 22473
diff changeset
166 tv.tv_sec = 1; /* 1 second timeout */
dec604030d92 Fix UDP select timeout.
diego
parents: 22473
diff changeset
167 tv.tv_usec = 0;
19318
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
168
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
169 FD_ZERO (&set);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
170 FD_SET (socket_server_fd, &set);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
171
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
172 err = select (socket_server_fd + 1, &set, NULL, NULL, &tv);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
173 if (err < 0)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
174 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
175 mp_msg (MSGT_NETWORK, MSGL_FATAL,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
176 "Select failed: %s\n", strerror (errno));
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
177 closesocket (socket_server_fd);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
178 return -1;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
179 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
180
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
181 if (err == 0)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
182 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
183 mp_msg (MSGT_NETWORK, MSGL_ERR,
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
184 "Timeout! No data from host %s\n", url->hostname);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
185 closesocket (socket_server_fd);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
186 return -1;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
187 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
188
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
189 err_len = sizeof (err);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
190 getsockopt (socket_server_fd, SOL_SOCKET, SO_ERROR, &err, &err_len);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
191 if (err)
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
192 {
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
193 mp_msg (MSGT_NETWORK, MSGL_DBG2, "Socket error: %d\n", err);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
194 closesocket (socket_server_fd);
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
195 return -1;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
196 }
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
197
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
198 return socket_server_fd;
a3ddd3320b47 removed udp socket creation code from rtp stack to a new dedicated udp helper file
ben
parents:
diff changeset
199 }