annotate stream/tcp.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 7b6a3948f5f2
children 44540930bf94
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
1 /*
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
2 * Network layer for MPlayer
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
3 * by Bertrand BAUDET <bertrand_baudet@yahoo.com>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
4 * (C) 2001, MPlayer team.
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
5 */
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
7 #include <stdlib.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
8 #include <string.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
9 #include <unistd.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
10
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
11 #include <errno.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
12 #include <ctype.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
13
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
14 #include <fcntl.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
15 #include <sys/time.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
16 #include <sys/types.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
17
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
18 #include "config.h"
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
19
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
20 #include "mp_msg.h"
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
21 #include "help_mp.h"
22142
84f95595f31f Fix a few gcc warnings, approved by Diego and Reimar.
rathann
parents: 22114
diff changeset
22 #include "input/input.h"
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
23
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
24 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
25 #include <netdb.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
26 #include <netinet/in.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
27 #include <sys/socket.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
28 #include <arpa/inet.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
29 #define closesocket close
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
30 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
31 #include <winsock2.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
32 #include <ws2tcpip.h>
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
33 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
34
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
35 #include "tcp.h"
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
36
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
37 /* IPv6 options */
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
38 int network_prefer_ipv4 = 0;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
39
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
40 // Converts an address family constant to a string
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
41
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
42 const char *af2String(int af) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
43 switch (af) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
44 case AF_INET: return "AF_INET";
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
45
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
46 #ifdef HAVE_AF_INET6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
47 case AF_INET6: return "AF_INET6";
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
48 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
49 default: return "Unknown address family!";
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
50 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
51 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
52
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
53
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
54
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
55 // Connect to a server using a TCP connection, with specified address family
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
56 // return -2 for fatal error, like unable to resolve name, connection timeout...
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
57 // return -1 is unable to connect to a particular port
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
58
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
59 int
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
60 connect2Server_with_af(char *host, int port, int af,int verb) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
61 int socket_server_fd;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
62 int err;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
63 socklen_t err_len;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
64 int ret,count = 0;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
65 fd_set set;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
66 struct timeval tv;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
67 union {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
68 struct sockaddr_in four;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
69 #ifdef HAVE_AF_INET6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
70 struct sockaddr_in6 six;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
71 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
72 } server_address;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
73 size_t server_address_size;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
74 void *our_s_addr; // Pointer to sin_addr or sin6_addr
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
75 struct hostent *hp=NULL;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
76 char buf[255];
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
77
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
78 #ifdef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
79 u_long val;
22379
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
80 int to;
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
81 #else
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
82 struct timeval to;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
83 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
84
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
85 socket_server_fd = socket(af, SOCK_STREAM, 0);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
86
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
87
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
88 if( socket_server_fd==-1 ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
89 // 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
90 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
91 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
92
22114
9bc7a6022cde Use defined() syntax instead without ().
reimar
parents: 22113
diff changeset
93 #if defined(SO_RCVTIMEO) && defined(SO_SNDTIMEO)
22379
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
94 #ifdef HAVE_WINSOCK2
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
95 /* timeout in milliseconds */
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
96 to = 10 * 1000;
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
97 #else
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
98 to.tv_sec = 10;
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
99 to.tv_usec = 0;
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
100 #endif
6b245d6e56a9 winsocks expects an int in milliseconds instead of struct timeval to set
ivo
parents: 22142
diff changeset
101 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
102 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
103 #endif
50c9dc00154d Add timeout to tcp connections, avoid hanging forever.
rtogni
parents: 19543
diff changeset
104
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
105 switch (af) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
106 case AF_INET: our_s_addr = (void *) &server_address.four.sin_addr; break;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
107 #ifdef HAVE_AF_INET6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
108 case AF_INET6: our_s_addr = (void *) &server_address.six.sin6_addr; break;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
109 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
110 default:
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
111 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
112 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
113 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
114
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
115
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
116 memset(&server_address, 0, sizeof(server_address));
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
117
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
118 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
119 #ifdef USE_ATON
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
120 if (inet_aton(host, our_s_addr)!=1)
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
121 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
122 if (inet_pton(af, host, our_s_addr)!=1)
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
123 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
124 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
125 if ( inet_addr(host)==INADDR_NONE )
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
126 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
127 {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
128 if(verb) mp_msg(MSGT_NETWORK,MSGL_STATUS,MSGTR_MPDEMUX_NW_ResolvingHostForAF, host, af2String(af));
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
129
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
130 #ifdef HAVE_GETHOSTBYNAME2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
131 hp=(struct hostent*)gethostbyname2( host, af );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
132 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
133 hp=(struct hostent*)gethostbyname( host );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
134 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
135 if( hp==NULL ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
136 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
137 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
138 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
139
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
140 memcpy( our_s_addr, (void*)hp->h_addr_list[0], hp->h_length );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
141 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
142 #ifdef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
143 else {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
144 unsigned long addr = inet_addr(host);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
145 memcpy( our_s_addr, (void*)&addr, sizeof(addr) );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
146 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
147 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
148
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
149 switch (af) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
150 case AF_INET:
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
151 server_address.four.sin_family=af;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
152 server_address.four.sin_port=htons(port);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
153 server_address_size = sizeof(server_address.four);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
154 break;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
155 #ifdef HAVE_AF_INET6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
156 case AF_INET6:
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
157 server_address.six.sin6_family=af;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
158 server_address.six.sin6_port=htons(port);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
159 server_address_size = sizeof(server_address.six);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
160 break;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
161 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
162 default:
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
163 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
164 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
165 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
166
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
167 #if defined(USE_ATON) || defined(HAVE_WINSOCK2)
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
168 strncpy( buf, inet_ntoa( *((struct in_addr*)our_s_addr) ), 255);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
169 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
170 inet_ntop(af, our_s_addr, buf, 255);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
171 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
172 if(verb) mp_msg(MSGT_NETWORK,MSGL_STATUS,MSGTR_MPDEMUX_NW_ConnectingToServer, host, buf , port );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
173
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
174 // Turn the socket as non blocking so we can timeout on the connection
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
175 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
176 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) | O_NONBLOCK );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
177 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
178 val = 1;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
179 ioctlsocket( socket_server_fd, FIONBIO, &val );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
180 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
181 if( connect( socket_server_fd, (struct sockaddr*)&server_address, server_address_size )==-1 ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
182 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
183 if( errno!=EINPROGRESS ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
184 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
185 if( (WSAGetLastError() != WSAEINPROGRESS) && (WSAGetLastError() != WSAEWOULDBLOCK) ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
186 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
187 if(verb) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_CantConnect2Server, af2String(af));
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
188 closesocket(socket_server_fd);
19543
e053647fbeec Cosmetics: recommit patch changing return values to defines
reimar
parents: 19542
diff changeset
189 return TCP_ERROR_PORT;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
190 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
191 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
192 tv.tv_sec = 0;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
193 tv.tv_usec = 500000;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
194 FD_ZERO( &set );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
195 FD_SET( socket_server_fd, &set );
24558
97eaba07ef9d Fix a few typos
reimar
parents: 22379
diff changeset
196 // When the connection will be made, we will have a writeable fd
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
197 while((ret = select(socket_server_fd+1, NULL, &set, NULL, &tv)) == 0) {
24559
7b6a3948f5f2 (Re)move idiotic checks, ret can't be < 0 or > 0 if the loop condition
reimar
parents: 24558
diff changeset
198 if(count > 30 || mp_input_check_interrupt(500)) {
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
199 if(count > 30)
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
200 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_ConnTimeout);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
201 else
24558
97eaba07ef9d Fix a few typos
reimar
parents: 22379
diff changeset
202 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
203 return TCP_ERROR_TIMEOUT;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
204 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
205 count++;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
206 FD_ZERO( &set );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
207 FD_SET( socket_server_fd, &set );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
208 tv.tv_sec = 0;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
209 tv.tv_usec = 500000;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
210 }
24559
7b6a3948f5f2 (Re)move idiotic checks, ret can't be < 0 or > 0 if the loop condition
reimar
parents: 24558
diff changeset
211 if (ret < 0) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_SelectFailed);
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
212
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
213 // Turn back the socket as blocking
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
214 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
215 fcntl( socket_server_fd, F_SETFL, fcntl(socket_server_fd, F_GETFL) & ~O_NONBLOCK );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
216 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
217 val = 0;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
218 ioctlsocket( socket_server_fd, FIONBIO, &val );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
219 #endif
24558
97eaba07ef9d Fix a few typos
reimar
parents: 22379
diff changeset
220 // Check if there were any errors
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
221 err_len = sizeof(int);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
222 ret = getsockopt(socket_server_fd,SOL_SOCKET,SO_ERROR,&err,&err_len);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
223 if(ret < 0) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
224 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
225 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
226 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
227 if(err > 0) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
228 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
229 return TCP_ERROR_PORT;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
230 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
231
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
232 return socket_server_fd;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
233 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
234
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
235 // Connect to a server using a TCP connection
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
236 // return -2 for fatal error, like unable to resolve name, connection timeout...
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
237 // return -1 is unable to connect to a particular port
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
238
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
239
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
240 int
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
241 connect2Server(char *host, int port, int verb) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
242 #ifdef HAVE_AF_INET6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
243 int r;
19543
e053647fbeec Cosmetics: recommit patch changing return values to defines
reimar
parents: 19542
diff changeset
244 int s = TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
245
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
246 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
247 if (r >= 0) return r;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
248
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
249 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
250 if (s == TCP_ERROR_FATAL) return r;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
251 return s;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
252 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
253 return connect2Server_with_af(host, port, AF_INET,verb);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
254 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
255
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
256
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
257 }