annotate stream/tcp.c @ 22153:0cf24df5d97b

Revert part of commit r22170. FFmpeg lavcodecs version is still (or according to ffmpeg commit r7868, it's back to) 49.3.0, so global variables are not yet directly accessable (if ever).
author iive
date Wed, 07 Feb 2007 12:31:37 +0000
parents 84f95595f31f
children 6b245d6e56a9
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;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
80 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
81
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
82 socket_server_fd = socket(af, SOCK_STREAM, 0);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
83
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 if( socket_server_fd==-1 ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
86 // 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
87 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
88 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
89
22114
9bc7a6022cde Use defined() syntax instead without ().
reimar
parents: 22113
diff changeset
90 #if defined(SO_RCVTIMEO) && defined(SO_SNDTIMEO)
22113
50c9dc00154d Add timeout to tcp connections, avoid hanging forever.
rtogni
parents: 19543
diff changeset
91 tv.tv_sec = 10;
50c9dc00154d Add timeout to tcp connections, avoid hanging forever.
rtogni
parents: 19543
diff changeset
92 tv.tv_usec = 0;
50c9dc00154d Add timeout to tcp connections, avoid hanging forever.
rtogni
parents: 19543
diff changeset
93 setsockopt(socket_server_fd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
50c9dc00154d Add timeout to tcp connections, avoid hanging forever.
rtogni
parents: 19543
diff changeset
94 setsockopt(socket_server_fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
50c9dc00154d Add timeout to tcp connections, avoid hanging forever.
rtogni
parents: 19543
diff changeset
95 #endif
50c9dc00154d Add timeout to tcp connections, avoid hanging forever.
rtogni
parents: 19543
diff changeset
96
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
97 switch (af) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
98 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
99 #ifdef HAVE_AF_INET6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
100 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
101 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
102 default:
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
103 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
104 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
105 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
106
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
107
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
108 memset(&server_address, 0, sizeof(server_address));
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
109
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
110 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
111 #ifdef USE_ATON
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
112 if (inet_aton(host, our_s_addr)!=1)
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
113 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
114 if (inet_pton(af, host, our_s_addr)!=1)
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
115 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
116 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
117 if ( inet_addr(host)==INADDR_NONE )
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
118 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
119 {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
120 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
121
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
122 #ifdef HAVE_GETHOSTBYNAME2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
123 hp=(struct hostent*)gethostbyname2( host, af );
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 hp=(struct hostent*)gethostbyname( host );
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 if( hp==NULL ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
128 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
129 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
130 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
131
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
132 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
133 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
134 #ifdef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
135 else {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
136 unsigned long addr = inet_addr(host);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
137 memcpy( our_s_addr, (void*)&addr, sizeof(addr) );
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 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
140
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
141 switch (af) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
142 case AF_INET:
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
143 server_address.four.sin_family=af;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
144 server_address.four.sin_port=htons(port);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
145 server_address_size = sizeof(server_address.four);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
146 break;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
147 #ifdef HAVE_AF_INET6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
148 case AF_INET6:
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
149 server_address.six.sin6_family=af;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
150 server_address.six.sin6_port=htons(port);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
151 server_address_size = sizeof(server_address.six);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
152 break;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
153 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
154 default:
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
155 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
156 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
157 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
158
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
159 #if defined(USE_ATON) || defined(HAVE_WINSOCK2)
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
160 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
161 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
162 inet_ntop(af, our_s_addr, buf, 255);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
163 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
164 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
165
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
166 // 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
167 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
168 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
169 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
170 val = 1;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
171 ioctlsocket( socket_server_fd, FIONBIO, &val );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
172 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
173 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
174 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
175 if( errno!=EINPROGRESS ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
176 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
177 if( (WSAGetLastError() != WSAEINPROGRESS) && (WSAGetLastError() != WSAEWOULDBLOCK) ) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
178 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
179 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
180 closesocket(socket_server_fd);
19543
e053647fbeec Cosmetics: recommit patch changing return values to defines
reimar
parents: 19542
diff changeset
181 return TCP_ERROR_PORT;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
182 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
183 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
184 tv.tv_sec = 0;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
185 tv.tv_usec = 500000;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
186 FD_ZERO( &set );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
187 FD_SET( socket_server_fd, &set );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
188 // When the connection will be made, we will have a writable fd
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
189 while((ret = select(socket_server_fd+1, NULL, &set, NULL, &tv)) == 0) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
190 if( ret<0 ) mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_SelectFailed);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
191 else if(ret > 0) break;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
192 else if(count > 30 || mp_input_check_interrupt(500)) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
193 if(count > 30)
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
194 mp_msg(MSGT_NETWORK,MSGL_ERR,MSGTR_MPDEMUX_NW_ConnTimeout);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
195 else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
196 mp_msg(MSGT_NETWORK,MSGL_V,"Connection interuppted by user\n");
19543
e053647fbeec Cosmetics: recommit patch changing return values to defines
reimar
parents: 19542
diff changeset
197 return TCP_ERROR_TIMEOUT;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
198 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
199 count++;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
200 FD_ZERO( &set );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
201 FD_SET( socket_server_fd, &set );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
202 tv.tv_sec = 0;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
203 tv.tv_usec = 500000;
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
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
206 // Turn back the socket as blocking
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
207 #ifndef HAVE_WINSOCK2
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
208 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
209 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
210 val = 0;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
211 ioctlsocket( socket_server_fd, FIONBIO, &val );
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
212 #endif
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
213 // Check if there were any error
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
214 err_len = sizeof(int);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
215 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
216 if(ret < 0) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
217 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
218 return TCP_ERROR_FATAL;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
219 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
220 if(err > 0) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
221 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
222 return TCP_ERROR_PORT;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
223 }
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
224
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
225 return socket_server_fd;
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
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
228 // Connect to a server using a TCP connection
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
229 // 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
230 // return -1 is unable to connect to a particular port
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
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
233 int
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
234 connect2Server(char *host, int port, int verb) {
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
235 #ifdef HAVE_AF_INET6
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
236 int r;
19543
e053647fbeec Cosmetics: recommit patch changing return values to defines
reimar
parents: 19542
diff changeset
237 int s = TCP_ERROR_FATAL;
19542
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 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
240 if (r >= 0) return r;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
241
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
242 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
243 if (s == TCP_ERROR_FATAL) return r;
19542
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
244 return s;
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
245 #else
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
246 return connect2Server_with_af(host, port, AF_INET,verb);
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
247 #endif
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
57980fe3ad96 Recreate tcp.c as partial copy from network.c
reimar
parents:
diff changeset
250 }