Mercurial > mplayer.hg
annotate stream/tcp.c @ 36369:3dfc82c0a678
Handle files with sample rate changes correctly.
For example concatenated MP3 files.
author | reimar |
---|---|
date | Tue, 15 Oct 2013 18:44:08 +0000 |
parents | 29b462786834 |
children | 67e2b2a5ce42 |
rev | line source |
---|---|
19542 | 1 /* |
2 * Network layer for MPlayer | |
30426
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
3 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
4 * Copyright (C) 2001 Bertrand BAUDET <bertrand_baudet@yahoo.com> |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
5 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
6 * This file is part of MPlayer. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
7 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
8 * MPlayer is free software; you can redistribute it and/or modify |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
11 * (at your option) any later version. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
12 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
13 * MPlayer is distributed in the hope that it will be useful, |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
16 * GNU General Public License for more details. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
17 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
18 * You should have received a copy of the GNU General Public License along |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
19 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29351
diff
changeset
|
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
19542 | 21 */ |
22 | |
36266 | 23 #define _BSD_SOURCE |
24 | |
19542 | 25 #include <stdlib.h> |
26 #include <string.h> | |
27 #include <unistd.h> | |
28 | |
29 #include <errno.h> | |
30 #include <ctype.h> | |
31 | |
32 #include <fcntl.h> | |
33 #include <sys/time.h> | |
34 #include <sys/types.h> | |
35 | |
36 #include "config.h" | |
37 | |
38 #include "mp_msg.h" | |
39 #include "help_mp.h" | |
27472
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
40 |
28402 | 41 #if !HAVE_WINSOCK2_H |
27472
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
42 #include <netdb.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
43 #include <netinet/in.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
44 #include <sys/socket.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
45 #include <arpa/inet.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
46 #else |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
47 #include <winsock2.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
48 #include <ws2tcpip.h> |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
49 #endif |
c0b233cd30ca
Revert moving closesocket definition and network headers to network.h.
diego
parents:
27464
diff
changeset
|
50 |
27473
ae5da477539e
Move '#define closesocket close' preprocessor directive to a common place
diego
parents:
27472
diff
changeset
|
51 #include "network.h" |
26751 | 52 #include "stream.h" |
19542 | 53 #include "tcp.h" |
29351 | 54 #include "libavutil/avstring.h" |
19542 | 55 |
56 /* IPv6 options */ | |
57 int network_prefer_ipv4 = 0; | |
58 | |
59 // Converts an address family constant to a string | |
60 | |
24841
44540930bf94
Make functions static if they aren't referenced externally.
zuxy
parents:
24559
diff
changeset
|
61 static const char *af2String(int af) { |
19542 | 62 switch (af) { |
63 case AF_INET: return "AF_INET"; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
64 |
19542 | 65 #ifdef HAVE_AF_INET6 |
66 case AF_INET6: return "AF_INET6"; | |
67 #endif | |
68 default: return "Unknown address family!"; | |
69 } | |
70 } | |
71 | |
72 | |
73 | |
74 // Connect to a server using a TCP connection, with specified address family | |
75 // return -2 for fatal error, like unable to resolve name, connection timeout... | |
76 // return -1 is unable to connect to a particular port | |
77 | |
24841
44540930bf94
Make functions static if they aren't referenced externally.
zuxy
parents:
24559
diff
changeset
|
78 static int |
19542 | 79 connect2Server_with_af(char *host, int port, int af,int verb) { |
80 int socket_server_fd; | |
81 int err; | |
82 socklen_t err_len; | |
83 int ret,count = 0; | |
84 fd_set set; | |
85 struct timeval tv; | |
86 union { | |
87 struct sockaddr_in four; | |
88 #ifdef HAVE_AF_INET6 | |
89 struct sockaddr_in6 six; | |
90 #endif | |
91 } server_address; | |
92 size_t server_address_size; | |
93 void *our_s_addr; // Pointer to sin_addr or sin6_addr | |
94 struct hostent *hp=NULL; | |
95 char buf[255]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
96 |
28402 | 97 #if HAVE_WINSOCK2_H |
28162 | 98 unsigned long val; |
22379
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
99 int to; |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
100 #else |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
101 struct timeval to; |
19542 | 102 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
103 |
30619
2fa6d8411b07
Make sure we do not try to use IPv6 with winsock2, we end up connecting
reimar
parents:
30426
diff
changeset
|
104 #if HAVE_WINSOCK2_H && defined(HAVE_AF_INET6) |
2fa6d8411b07
Make sure we do not try to use IPv6 with winsock2, we end up connecting
reimar
parents:
30426
diff
changeset
|
105 // our winsock name resolution code can not handle IPv6 |
2fa6d8411b07
Make sure we do not try to use IPv6 with winsock2, we end up connecting
reimar
parents:
30426
diff
changeset
|
106 if (af == AF_INET6) { |
2fa6d8411b07
Make sure we do not try to use IPv6 with winsock2, we end up connecting
reimar
parents:
30426
diff
changeset
|
107 mp_msg(MSGT_NETWORK, MSGL_WARN, "IPv6 not supported for winsock2\n"); |
2fa6d8411b07
Make sure we do not try to use IPv6 with winsock2, we end up connecting
reimar
parents:
30426
diff
changeset
|
108 return TCP_ERROR_FATAL; |
2fa6d8411b07
Make sure we do not try to use IPv6 with winsock2, we end up connecting
reimar
parents:
30426
diff
changeset
|
109 } |
2fa6d8411b07
Make sure we do not try to use IPv6 with winsock2, we end up connecting
reimar
parents:
30426
diff
changeset
|
110 #endif |
2fa6d8411b07
Make sure we do not try to use IPv6 with winsock2, we end up connecting
reimar
parents:
30426
diff
changeset
|
111 |
19542 | 112 socket_server_fd = socket(af, SOCK_STREAM, 0); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
113 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
114 |
19542 | 115 if( socket_server_fd==-1 ) { |
116 // mp_msg(MSGT_NETWORK,MSGL_ERR,"Failed to create %s socket:\n", af2String(af)); | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
117 return TCP_ERROR_FATAL; |
19542 | 118 } |
119 | |
22114 | 120 #if defined(SO_RCVTIMEO) && defined(SO_SNDTIMEO) |
28402 | 121 #if HAVE_WINSOCK2_H |
22379
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
122 /* timeout in milliseconds */ |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
123 to = 10 * 1000; |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
124 #else |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
125 to.tv_sec = 10; |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
126 to.tv_usec = 0; |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
127 #endif |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
128 setsockopt(socket_server_fd, SOL_SOCKET, SO_RCVTIMEO, &to, sizeof(to)); |
6b245d6e56a9
winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents:
22142
diff
changeset
|
129 setsockopt(socket_server_fd, SOL_SOCKET, SO_SNDTIMEO, &to, sizeof(to)); |
22113
50c9dc00154d
Add timeout to tcp connections, avoid hanging forever.
rtogni
parents:
19543
diff
changeset
|
130 #endif |
50c9dc00154d
Add timeout to tcp connections, avoid hanging forever.
rtogni
parents:
19543
diff
changeset
|
131 |
19542 | 132 switch (af) { |
35249 | 133 case AF_INET: our_s_addr = &server_address.four.sin_addr; break; |
19542 | 134 #ifdef HAVE_AF_INET6 |
35249 | 135 case AF_INET6: our_s_addr = &server_address.six.sin6_addr; break; |
19542 | 136 #endif |
137 default: | |
138 mp_msg(MSGT_NETWORK,MSGL_ERR, MSGTR_MPDEMUX_NW_UnknownAF, af); | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
139 return TCP_ERROR_FATAL; |
19542 | 140 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
141 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
142 |
19542 | 143 memset(&server_address, 0, sizeof(server_address)); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
144 |
28404
613f075b4ef0
Restructure network tests: Always check for both inet_aton and inet_pton.
diego
parents:
28402
diff
changeset
|
145 #if HAVE_INET_PTON |
613f075b4ef0
Restructure network tests: Always check for both inet_aton and inet_pton.
diego
parents:
28402
diff
changeset
|
146 if (inet_pton(af, host, our_s_addr)!=1) |
613f075b4ef0
Restructure network tests: Always check for both inet_aton and inet_pton.
diego
parents:
28402
diff
changeset
|
147 #elif HAVE_INET_ATON |
19542 | 148 if (inet_aton(host, our_s_addr)!=1) |
28404
613f075b4ef0
Restructure network tests: Always check for both inet_aton and inet_pton.
diego
parents:
28402
diff
changeset
|
149 #elif HAVE_WINSOCK2_H |
19542 | 150 if ( inet_addr(host)==INADDR_NONE ) |
151 #endif | |
152 { | |
153 if(verb) mp_msg(MSGT_NETWORK,MSGL_STATUS,MSGTR_MPDEMUX_NW_ResolvingHostForAF, host, af2String(af)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
154 |
19542 | 155 #ifdef HAVE_GETHOSTBYNAME2 |
35249 | 156 hp=gethostbyname2( host, af ); |
19542 | 157 #else |
35249 | 158 hp=gethostbyname( host ); |
19542 | 159 #endif |
160 if( hp==NULL ) { | |
161 if(verb) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_CantResolv, af2String(af), host); | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
162 return TCP_ERROR_FATAL; |
19542 | 163 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
164 |
36260
a2750366a255
stream/tcp: Check that host object has the right AF before connect
al
parents:
35249
diff
changeset
|
165 if (af != hp->h_addrtype) return TCP_ERROR_FATAL; |
a2750366a255
stream/tcp: Check that host object has the right AF before connect
al
parents:
35249
diff
changeset
|
166 |
35249 | 167 memcpy( our_s_addr, hp->h_addr_list[0], hp->h_length ); |
19542 | 168 } |
28402 | 169 #if HAVE_WINSOCK2_H |
19542 | 170 else { |
171 unsigned long addr = inet_addr(host); | |
35249 | 172 memcpy( our_s_addr, &addr, sizeof(addr) ); |
19542 | 173 } |
174 #endif | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
175 |
19542 | 176 switch (af) { |
177 case AF_INET: | |
178 server_address.four.sin_family=af; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
179 server_address.four.sin_port=htons(port); |
19542 | 180 server_address_size = sizeof(server_address.four); |
181 break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
182 #ifdef HAVE_AF_INET6 |
19542 | 183 case AF_INET6: |
184 server_address.six.sin6_family=af; | |
185 server_address.six.sin6_port=htons(port); | |
186 server_address_size = sizeof(server_address.six); | |
187 break; | |
188 #endif | |
189 default: | |
190 mp_msg(MSGT_NETWORK,MSGL_ERR, MSGTR_MPDEMUX_NW_UnknownAF, af); | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
191 return TCP_ERROR_FATAL; |
19542 | 192 } |
193 | |
31432
1bd903001629
Prefere the use of inet_ntop over inet_ntoa, as the former is ipv6 safe.
attila
parents:
30619
diff
changeset
|
194 #if HAVE_INET_PTON |
1bd903001629
Prefere the use of inet_ntop over inet_ntoa, as the former is ipv6 safe.
attila
parents:
30619
diff
changeset
|
195 inet_ntop(af, our_s_addr, buf, 255); |
1bd903001629
Prefere the use of inet_ntop over inet_ntoa, as the former is ipv6 safe.
attila
parents:
30619
diff
changeset
|
196 #elif HAVE_INET_ATON || defined(HAVE_WINSOCK2_H) |
29351 | 197 av_strlcpy( buf, inet_ntoa( *((struct in_addr*)our_s_addr) ), 255); |
19542 | 198 #endif |
199 if(verb) mp_msg(MSGT_NETWORK,MSGL_STATUS,MSGTR_MPDEMUX_NW_ConnectingToServer, host, buf , port ); | |
200 | |
201 // Turn the socket as non blocking so we can timeout on the connection | |
28402 | 202 #if !HAVE_WINSOCK2_H |
19542 | 203 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) | O_NONBLOCK ); |
204 #else | |
205 val = 1; | |
206 ioctlsocket( socket_server_fd, FIONBIO, &val ); | |
207 #endif | |
208 if( connect( socket_server_fd, (struct sockaddr*)&server_address, server_address_size )==-1 ) { | |
28402 | 209 #if !HAVE_WINSOCK2_H |
19542 | 210 if( errno!=EINPROGRESS ) { |
211 #else | |
212 if( (WSAGetLastError() != WSAEINPROGRESS) && (WSAGetLastError() != WSAEWOULDBLOCK) ) { | |
213 #endif | |
214 if(verb) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_CantConnect2Server, af2String(af)); | |
215 closesocket(socket_server_fd); | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
216 return TCP_ERROR_PORT; |
19542 | 217 } |
218 } | |
219 tv.tv_sec = 0; | |
220 tv.tv_usec = 500000; | |
221 FD_ZERO( &set ); | |
222 FD_SET( socket_server_fd, &set ); | |
24558 | 223 // When the connection will be made, we will have a writeable fd |
19542 | 224 while((ret = select(socket_server_fd+1, NULL, &set, NULL, &tv)) == 0) { |
26326
5bfc1d8bece9
Remove the need for code using stream to export an mp_input_check_interrupt()
albeu
parents:
24841
diff
changeset
|
225 if(count > 30 || stream_check_interrupt(500)) { |
19542 | 226 if(count > 30) |
227 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_ConnTimeout); | |
228 else | |
24558 | 229 mp_msg(MSGT_NETWORK,MSGL_V,"Connection interrupted by user\n"); |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
230 return TCP_ERROR_TIMEOUT; |
19542 | 231 } |
232 count++; | |
233 FD_ZERO( &set ); | |
234 FD_SET( socket_server_fd, &set ); | |
235 tv.tv_sec = 0; | |
236 tv.tv_usec = 500000; | |
237 } | |
24559
7b6a3948f5f2
(Re)move idiotic checks, ret can't be < 0 or > 0 if the loop condition
reimar
parents:
24558
diff
changeset
|
238 if (ret < 0) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_SelectFailed); |
19542 | 239 |
240 // Turn back the socket as blocking | |
28402 | 241 #if !HAVE_WINSOCK2_H |
19542 | 242 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) & ~O_NONBLOCK ); |
243 #else | |
244 val = 0; | |
245 ioctlsocket( socket_server_fd, FIONBIO, &val ); | |
246 #endif | |
24558 | 247 // Check if there were any errors |
19542 | 248 err_len = sizeof(int); |
249 ret = getsockopt(socket_server_fd,SOL_SOCKET,SO_ERROR,&err,&err_len); | |
250 if(ret < 0) { | |
251 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_GetSockOptFailed,strerror(errno)); | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
252 return TCP_ERROR_FATAL; |
19542 | 253 } |
254 if(err > 0) { | |
255 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_ConnectError,strerror(err)); | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
256 return TCP_ERROR_PORT; |
19542 | 257 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
258 |
19542 | 259 return socket_server_fd; |
260 } | |
261 | |
262 // Connect to a server using a TCP connection | |
263 // return -2 for fatal error, like unable to resolve name, connection timeout... | |
264 // return -1 is unable to connect to a particular port | |
265 | |
266 | |
267 int | |
268 connect2Server(char *host, int port, int verb) { | |
269 #ifdef HAVE_AF_INET6 | |
270 int r; | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
271 int s = TCP_ERROR_FATAL; |
19542 | 272 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
273 r = connect2Server_with_af(host, port, network_prefer_ipv4 ? AF_INET:AF_INET6,verb); |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
274 if (r >= 0) return r; |
19542 | 275 |
276 s = connect2Server_with_af(host, port, network_prefer_ipv4 ? AF_INET6:AF_INET,verb); | |
19543
e053647fbeec
Cosmetics: recommit patch changing return values to defines
reimar
parents:
19542
diff
changeset
|
277 if (s == TCP_ERROR_FATAL) return r; |
19542 | 278 return s; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
279 #else |
19542 | 280 return connect2Server_with_af(host, port, AF_INET,verb); |
281 #endif | |
282 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28404
diff
changeset
|
283 |
19542 | 284 } |