blob: 8dd23835d37984c6882f8c809d1f56010023e02d [file] [log] [blame]
Fred Drakea6070f02000-08-16 14:14:32 +00001# Wrapper module for _socket, providing some additional facilities
2# implemented in Python.
3
4"""\
5This module provides socket operations and some related functions.
6On Unix, it supports IP (Internet Protocol) and Unix domain sockets.
Tim Peters495ad3c2001-01-15 01:36:40 +00007On other systems, it only supports IP. Functions specific for a
Martin v. Löwisaf484d52000-09-30 11:34:30 +00008socket are available as methods of the socket object.
Fred Drakea6070f02000-08-16 14:14:32 +00009
10Functions:
11
12socket() -- create a new socket object
Dave Cole331708b2004-08-09 04:51:41 +000013socketpair() -- create a pair of new socket objects [*]
Fred Drakea6070f02000-08-16 14:14:32 +000014fromfd() -- create a socket object from an open file descriptor [*]
15gethostname() -- return the current hostname
16gethostbyname() -- map a hostname to its IP number
17gethostbyaddr() -- map an IP number or hostname to DNS info
18getservbyname() -- map a service name and a protocol name to a port number
19getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number
20ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
21htons(), htonl() -- convert 16, 32 bit int from host to network byte order
22inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
23inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
24ssl() -- secure socket layer support (only available if configured)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000025socket.getdefaulttimeout() -- get the default timeout value
26socket.setdefaulttimeout() -- set the default timeout value
Guido van Rossumd8faa362007-04-27 19:54:29 +000027create_connection() -- connects to an address, with an optional timeout
Fred Drakea6070f02000-08-16 14:14:32 +000028
29 [*] not available on all platforms!
30
31Special objects:
32
33SocketType -- type object for socket objects
34error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000035has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000036
37Integer constants:
38
39AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
40SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
41
42Many other constants may be defined; these may be used in calls to
43the setsockopt() and getsockopt() methods.
44"""
45
Tim Peters18e67782002-02-17 04:25:24 +000046import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000047from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000048
Guido van Rossumc18993f2002-08-08 15:16:20 +000049_have_ssl = False
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000050try:
Guido van Rossumde7cade2002-08-08 15:25:28 +000051 import _ssl
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000052 from _ssl import *
Guido van Rossumc18993f2002-08-08 15:16:20 +000053 _have_ssl = True
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000054except ImportError:
Guido van Rossumc18993f2002-08-08 15:16:20 +000055 pass
Fred Drakea6070f02000-08-16 14:14:32 +000056
57import os, sys
58
Fred Drake70d566b2003-04-29 19:50:25 +000059try:
60 from errno import EBADF
61except ImportError:
62 EBADF = 9
63
Skip Montanaro0de65802001-02-15 22:15:14 +000064__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000065__all__.extend(os._get_exports_list(_socket))
Guido van Rossumde7cade2002-08-08 15:25:28 +000066if _have_ssl:
67 __all__.extend(os._get_exports_list(_ssl))
Skip Montanaro0de65802001-02-15 22:15:14 +000068
Guido van Rossumc18993f2002-08-08 15:16:20 +000069_realsocket = socket
Martin v. Löwis1867f242003-06-14 13:30:53 +000070if _have_ssl:
71 _realssl = ssl
72 def ssl(sock, keyfile=None, certfile=None):
73 if hasattr(sock, "_sock"):
74 sock = sock._sock
75 return _realssl(sock, keyfile, certfile)
Fred Drakea6070f02000-08-16 14:14:32 +000076
77# WSA error codes
78if sys.platform.lower().startswith("win"):
79 errorTab = {}
80 errorTab[10004] = "The operation was interrupted."
81 errorTab[10009] = "A bad file handle was passed."
82 errorTab[10013] = "Permission denied."
83 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
84 errorTab[10022] = "An invalid operation was attempted."
85 errorTab[10035] = "The socket operation would block"
86 errorTab[10036] = "A blocking operation is already in progress."
87 errorTab[10048] = "The network address is in use."
88 errorTab[10054] = "The connection has been reset."
89 errorTab[10058] = "The network has been shut down."
90 errorTab[10060] = "The operation timed out."
91 errorTab[10061] = "Connection refused."
92 errorTab[10063] = "The name is too long."
93 errorTab[10064] = "The host is down."
94 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000095 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000096
Fred Drakea6070f02000-08-16 14:14:32 +000097
98
99def getfqdn(name=''):
100 """Get fully qualified domain name from name.
101
102 An empty argument is interpreted as meaning the local host.
103
104 First the hostname returned by gethostbyaddr() is checked, then
105 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000106 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000107 """
108 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000109 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000110 name = gethostname()
111 try:
112 hostname, aliases, ipaddrs = gethostbyaddr(name)
113 except error:
114 pass
115 else:
116 aliases.insert(0, hostname)
117 for name in aliases:
118 if '.' in name:
119 break
120 else:
121 name = hostname
122 return name
123
124
Guido van Rossume5e50592001-08-18 01:23:20 +0000125_socketmethods = (
126 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
127 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Skip Montanaroc6899182003-04-29 19:27:26 +0000128 'sendall', 'setblocking',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000129 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000130
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000131if sys.platform == "riscos":
132 _socketmethods = _socketmethods + ('sleeptaskw',)
133
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000134# All the method names that must be delegated to either the real socket
135# object or the _closedsocket object.
136_delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
137 "send", "sendto")
138
Guido van Rossum715f9702002-08-08 18:11:36 +0000139class _closedsocket(object):
140 __slots__ = []
Skip Montanaroc6899182003-04-29 19:27:26 +0000141 def _dummy(*args):
Fred Drake70d566b2003-04-29 19:50:25 +0000142 raise error(EBADF, 'Bad file descriptor')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000143 # All _delegate_methods must also be initialized here.
144 send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
145 __getattr__ = _dummy
Guido van Rossum715f9702002-08-08 18:11:36 +0000146
Guido van Rossumc18993f2002-08-08 15:16:20 +0000147class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000148
Guido van Rossumc18993f2002-08-08 15:16:20 +0000149 __doc__ = _realsocket.__doc__
150
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000151 __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000152
Guido van Rossumc18993f2002-08-08 15:16:20 +0000153 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
154 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000155 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000156 self._sock = _sock
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000157 for method in _delegate_methods:
158 setattr(self, method, getattr(_sock, method))
Fred Drakea6070f02000-08-16 14:14:32 +0000159
160 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000161 self._sock = _closedsocket()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000162 dummy = self._sock._dummy
163 for method in _delegate_methods:
164 setattr(self, method, dummy)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000165 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000166
Fred Drakea6070f02000-08-16 14:14:32 +0000167 def accept(self):
168 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000169 return _socketobject(_sock=sock), addr
170 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000171
172 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000173 """dup() -> socket object
174
175 Return a new socket object connected to the same system resource."""
176 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000177
178 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000179 """makefile([mode[, bufsize]]) -> file object
180
181 Return a regular file object corresponding to the socket. The mode
182 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000183 return _fileobject(self._sock, mode, bufsize)
184
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000185 family = property(lambda self: self._sock.family, doc="the socket family")
186 type = property(lambda self: self._sock.type, doc="the socket type")
187 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
188
Guido van Rossumc18993f2002-08-08 15:16:20 +0000189 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
190 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000191 for _m in _socketmethods:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000192 exec(_s % (_m, _m, _m, _m))
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000193 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000194
Skip Montanaro89feabc2003-03-30 04:54:24 +0000195socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000196
Guido van Rossumc18993f2002-08-08 15:16:20 +0000197class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000198 """Faux file object attached to a socket object."""
199
200 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000201 name = "<socket>"
202
Guido van Rossum79139b22007-02-09 23:20:19 +0000203 __slots__ = ["mode", "bufsize",
Guido van Rossumc18993f2002-08-08 15:16:20 +0000204 # "closed" is a property, see below
Thomas Woutersb2137042007-02-01 18:02:27 +0000205 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf",
206 "_close"]
Fred Drakea6070f02000-08-16 14:14:32 +0000207
Thomas Woutersb2137042007-02-01 18:02:27 +0000208 def __init__(self, sock, mode='rb', bufsize=-1, close=False):
Fred Drakea6070f02000-08-16 14:14:32 +0000209 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000210 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000211 if bufsize < 0:
212 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000213 self.bufsize = bufsize
Guido van Rossum443fec32002-08-08 01:02:16 +0000214 if bufsize == 0:
215 self._rbufsize = 1
216 elif bufsize == 1:
217 self._rbufsize = self.default_bufsize
218 else:
219 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000220 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000221 self._rbuf = "" # A string
222 self._wbuf = [] # A list of strings
Thomas Woutersb2137042007-02-01 18:02:27 +0000223 self._close = close
Fred Drakea6070f02000-08-16 14:14:32 +0000224
Guido van Rossumc18993f2002-08-08 15:16:20 +0000225 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000226 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000227 closed = property(_getclosed, doc="True if the file is closed")
228
Fred Drakea6070f02000-08-16 14:14:32 +0000229 def close(self):
230 try:
231 if self._sock:
232 self.flush()
233 finally:
Thomas Woutersb2137042007-02-01 18:02:27 +0000234 if self._close:
235 self._sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000236 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000237
238 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000239 try:
240 self.close()
241 except:
242 # close() may fail if __init__ didn't complete
243 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000244
245 def flush(self):
246 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000247 buffer = "".join(self._wbuf)
248 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000249 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000250
Neal Norwitz2b342902002-06-13 22:18:39 +0000251 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000252 return self._sock.fileno()
253
254 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000255 data = str(data) # XXX Should really reject non-string non-buffers
256 if not data:
257 return
258 self._wbuf.append(data)
259 if (self._wbufsize == 0 or
260 self._wbufsize == 1 and '\n' in data or
261 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000262 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000263
264 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000265 # XXX We could do better here for very long lists
266 # XXX Should really reject non-string non-buffers
267 self._wbuf.extend(filter(None, map(str, list)))
268 if (self._wbufsize <= 1 or
269 self._get_wbuf_len() >= self._wbufsize):
270 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000271
Guido van Rossum443fec32002-08-08 01:02:16 +0000272 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000273 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000274 for x in self._wbuf:
275 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000276 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000277
Guido van Rossum67f7a382002-06-06 21:08:16 +0000278 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000279 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000280 if size < 0:
281 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000282 buffers = []
283 if data:
284 buffers.append(data)
285 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000286 if self._rbufsize <= 1:
287 recv_size = self.default_bufsize
288 else:
289 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000290 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000291 data = self._sock.recv(recv_size)
292 if not data:
293 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000294 buffers.append(data)
295 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000296 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000297 # Read until size bytes or EOF seen, whichever comes first
298 buf_len = len(data)
299 if buf_len >= size:
300 self._rbuf = data[size:]
301 return data[:size]
302 buffers = []
303 if data:
304 buffers.append(data)
305 self._rbuf = ""
306 while True:
307 left = size - buf_len
308 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000309 data = self._sock.recv(recv_size)
310 if not data:
311 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000312 buffers.append(data)
313 n = len(data)
314 if n >= left:
315 self._rbuf = data[left:]
316 buffers[-1] = data[:left]
317 break
318 buf_len += n
319 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000320
Guido van Rossum67f7a382002-06-06 21:08:16 +0000321 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000322 data = self._rbuf
323 if size < 0:
324 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000325 if self._rbufsize <= 1:
326 # Speed up unbuffered case
327 assert data == ""
328 buffers = []
329 recv = self._sock.recv
330 while data != "\n":
331 data = recv(1)
332 if not data:
333 break
334 buffers.append(data)
335 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000336 nl = data.find('\n')
337 if nl >= 0:
338 nl += 1
339 self._rbuf = data[nl:]
340 return data[:nl]
341 buffers = []
342 if data:
343 buffers.append(data)
344 self._rbuf = ""
345 while True:
346 data = self._sock.recv(self._rbufsize)
347 if not data:
348 break
349 buffers.append(data)
350 nl = data.find('\n')
351 if nl >= 0:
352 nl += 1
353 self._rbuf = data[nl:]
354 buffers[-1] = data[:nl]
355 break
356 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000357 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000358 # Read until size bytes or \n or EOF seen, whichever comes first
359 nl = data.find('\n', 0, size)
360 if nl >= 0:
361 nl += 1
362 self._rbuf = data[nl:]
363 return data[:nl]
364 buf_len = len(data)
365 if buf_len >= size:
366 self._rbuf = data[size:]
367 return data[:size]
368 buffers = []
369 if data:
370 buffers.append(data)
371 self._rbuf = ""
372 while True:
373 data = self._sock.recv(self._rbufsize)
374 if not data:
375 break
376 buffers.append(data)
377 left = size - buf_len
378 nl = data.find('\n', 0, left)
379 if nl >= 0:
380 nl += 1
381 self._rbuf = data[nl:]
382 buffers[-1] = data[:nl]
383 break
384 n = len(data)
385 if n >= left:
386 self._rbuf = data[left:]
387 buffers[-1] = data[:left]
388 break
389 buf_len += n
390 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000391
392 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000393 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000394 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000395 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000396 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000397 if not line:
398 break
Fred Drakea6070f02000-08-16 14:14:32 +0000399 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000400 total += len(line)
401 if sizehint and total >= sizehint:
402 break
Fred Drakea6070f02000-08-16 14:14:32 +0000403 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000404
405 # Iterator protocols
406
407 def __iter__(self):
408 return self
409
Georg Brandla18af4e2007-04-21 15:47:16 +0000410 def __next__(self):
Guido van Rossum443fec32002-08-08 01:02:16 +0000411 line = self.readline()
412 if not line:
413 raise StopIteration
414 return line
Guido van Rossumd8faa362007-04-27 19:54:29 +0000415
416
417def create_connection(address, timeout=None):
418 """Connect to address (host, port) with an optional timeout.
419
420 Provides access to socketobject timeout for higher-level
421 protocols. Passing a timeout will set the timeout on the
422 socket instance (if not present, or passed as None, the
423 default global timeout setting will be used).
424 """
425
426 msg = "getaddrinfo returns an empty list"
427 host, port = address
428 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
429 af, socktype, proto, canonname, sa = res
430 sock = None
431 try:
432 sock = socket(af, socktype, proto)
433 if timeout is not None:
434 sock.settimeout(timeout)
435 sock.connect(sa)
436 return sock
437
438 except error as err:
439 msg = err
440 if sock is not None:
441 sock.close()
442
443 raise error(msg)