blob: c03e884aba9557404bd017533953170ac4595d40 [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
Facundo Batista07c78be2007-03-23 18:54:07 +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
Martin v. Löwis7596e832006-07-01 15:33:37 +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')
Martin v. Löwis7596e832006-07-01 15:33:37 +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
Martin v. Löwis7596e832006-07-01 15:33:37 +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
Martin v. Löwis7596e832006-07-01 15:33:37 +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()
Martin v. Löwis7596e832006-07-01 15:33:37 +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)
Tim Peters0ae07bd2006-03-22 03:23:21 +0000184
Georg Brandlbb03ac02006-03-21 18:17:25 +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")
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000188
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:
Guido van Rossumc18993f2002-08-08 15:16:20 +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
203 __slots__ = ["mode", "bufsize", "softspace",
204 # "closed" is a property, see below
Georg Brandldd7b0522007-01-21 10:35:10 +0000205 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf",
206 "_close"]
Fred Drakea6070f02000-08-16 14:14:32 +0000207
Georg Brandldd7b0522007-01-21 10:35:10 +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
214 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000215 if bufsize == 0:
216 self._rbufsize = 1
217 elif bufsize == 1:
218 self._rbufsize = self.default_bufsize
219 else:
220 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000221 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000222 self._rbuf = "" # A string
223 self._wbuf = [] # A list of strings
Georg Brandldd7b0522007-01-21 10:35:10 +0000224 self._close = close
Fred Drakea6070f02000-08-16 14:14:32 +0000225
Guido van Rossumc18993f2002-08-08 15:16:20 +0000226 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000227 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000228 closed = property(_getclosed, doc="True if the file is closed")
229
Fred Drakea6070f02000-08-16 14:14:32 +0000230 def close(self):
231 try:
232 if self._sock:
233 self.flush()
234 finally:
Georg Brandldd7b0522007-01-21 10:35:10 +0000235 if self._close:
236 self._sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000237 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000238
239 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000240 try:
241 self.close()
242 except:
243 # close() may fail if __init__ didn't complete
244 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000245
246 def flush(self):
247 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000248 buffer = "".join(self._wbuf)
249 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000250 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000251
Neal Norwitz2b342902002-06-13 22:18:39 +0000252 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000253 return self._sock.fileno()
254
255 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000256 data = str(data) # XXX Should really reject non-string non-buffers
257 if not data:
258 return
259 self._wbuf.append(data)
260 if (self._wbufsize == 0 or
261 self._wbufsize == 1 and '\n' in data or
262 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000263 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000264
265 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000266 # XXX We could do better here for very long lists
267 # XXX Should really reject non-string non-buffers
268 self._wbuf.extend(filter(None, map(str, list)))
269 if (self._wbufsize <= 1 or
270 self._get_wbuf_len() >= self._wbufsize):
271 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000272
Guido van Rossum443fec32002-08-08 01:02:16 +0000273 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000274 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000275 for x in self._wbuf:
276 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000277 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000278
Guido van Rossum67f7a382002-06-06 21:08:16 +0000279 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000280 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000281 if size < 0:
282 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000283 buffers = []
284 if data:
285 buffers.append(data)
286 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000287 if self._rbufsize <= 1:
288 recv_size = self.default_bufsize
289 else:
290 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000291 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000292 data = self._sock.recv(recv_size)
293 if not data:
294 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000295 buffers.append(data)
296 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000297 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000298 # Read until size bytes or EOF seen, whichever comes first
299 buf_len = len(data)
300 if buf_len >= size:
301 self._rbuf = data[size:]
302 return data[:size]
303 buffers = []
304 if data:
305 buffers.append(data)
306 self._rbuf = ""
307 while True:
308 left = size - buf_len
309 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000310 data = self._sock.recv(recv_size)
311 if not data:
312 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000313 buffers.append(data)
314 n = len(data)
315 if n >= left:
316 self._rbuf = data[left:]
317 buffers[-1] = data[:left]
318 break
319 buf_len += n
320 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000321
Guido van Rossum67f7a382002-06-06 21:08:16 +0000322 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000323 data = self._rbuf
324 if size < 0:
325 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000326 if self._rbufsize <= 1:
327 # Speed up unbuffered case
328 assert data == ""
329 buffers = []
330 recv = self._sock.recv
331 while data != "\n":
332 data = recv(1)
333 if not data:
334 break
335 buffers.append(data)
336 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000337 nl = data.find('\n')
338 if nl >= 0:
339 nl += 1
340 self._rbuf = data[nl:]
341 return data[:nl]
342 buffers = []
343 if data:
344 buffers.append(data)
345 self._rbuf = ""
346 while True:
347 data = self._sock.recv(self._rbufsize)
348 if not data:
349 break
350 buffers.append(data)
351 nl = data.find('\n')
352 if nl >= 0:
353 nl += 1
354 self._rbuf = data[nl:]
355 buffers[-1] = data[:nl]
356 break
357 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000358 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000359 # Read until size bytes or \n or EOF seen, whichever comes first
360 nl = data.find('\n', 0, size)
361 if nl >= 0:
362 nl += 1
363 self._rbuf = data[nl:]
364 return data[:nl]
365 buf_len = len(data)
366 if buf_len >= size:
367 self._rbuf = data[size:]
368 return data[:size]
369 buffers = []
370 if data:
371 buffers.append(data)
372 self._rbuf = ""
373 while True:
374 data = self._sock.recv(self._rbufsize)
375 if not data:
376 break
377 buffers.append(data)
378 left = size - buf_len
379 nl = data.find('\n', 0, left)
380 if nl >= 0:
381 nl += 1
382 self._rbuf = data[nl:]
383 buffers[-1] = data[:nl]
384 break
385 n = len(data)
386 if n >= left:
387 self._rbuf = data[left:]
388 buffers[-1] = data[:left]
389 break
390 buf_len += n
391 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000392
393 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000394 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000395 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000396 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000397 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000398 if not line:
399 break
Fred Drakea6070f02000-08-16 14:14:32 +0000400 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000401 total += len(line)
402 if sizehint and total >= sizehint:
403 break
Fred Drakea6070f02000-08-16 14:14:32 +0000404 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000405
406 # Iterator protocols
407
408 def __iter__(self):
409 return self
410
411 def next(self):
412 line = self.readline()
413 if not line:
414 raise StopIteration
415 return line
Facundo Batista07c78be2007-03-23 18:54:07 +0000416
417
418def create_connection(address, timeout=None):
419 """Connect to address (host, port) with an optional timeout.
420
421 Provides access to socketobject timeout for higher-level
422 protocols. Passing a timeout will set the timeout on the
423 socket instance (if not present, or passed as None, the
424 default global timeout setting will be used).
425 """
426
427 msg = "getaddrinfo returns an empty list"
428 host, port = address
429 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
430 af, socktype, proto, canonname, sa = res
431 sock = None
432 try:
433 sock = socket(af, socktype, proto)
434 if timeout is not None:
435 sock.settimeout(timeout)
436 sock.connect(sa)
437 return sock
438
439 except error, msg:
440 if sock is not None:
441 sock.close()
442
443 raise error, msg