blob: 48bb4f6f7bc55348fbba5bffd0c920645b88f600 [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
Neal Norwitz0d4c06e2007-04-25 06:30:05 +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:
Martin v. Löwis1867f242003-06-14 13:30:53 +000071 def ssl(sock, keyfile=None, certfile=None):
Guido van Rossum4f2c3dd2007-08-25 15:08:43 +000072 import ssl as realssl
73 return realssl.sslwrap_simple(sock, keyfile, certfile)
74 __all__.append("ssl")
Fred Drakea6070f02000-08-16 14:14:32 +000075
76# WSA error codes
77if sys.platform.lower().startswith("win"):
78 errorTab = {}
79 errorTab[10004] = "The operation was interrupted."
80 errorTab[10009] = "A bad file handle was passed."
81 errorTab[10013] = "Permission denied."
82 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
83 errorTab[10022] = "An invalid operation was attempted."
84 errorTab[10035] = "The socket operation would block"
85 errorTab[10036] = "A blocking operation is already in progress."
86 errorTab[10048] = "The network address is in use."
87 errorTab[10054] = "The connection has been reset."
88 errorTab[10058] = "The network has been shut down."
89 errorTab[10060] = "The operation timed out."
90 errorTab[10061] = "Connection refused."
91 errorTab[10063] = "The name is too long."
92 errorTab[10064] = "The host is down."
93 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000094 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000095
Fred Drakea6070f02000-08-16 14:14:32 +000096
97
98def getfqdn(name=''):
99 """Get fully qualified domain name from name.
100
101 An empty argument is interpreted as meaning the local host.
102
103 First the hostname returned by gethostbyaddr() is checked, then
104 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000105 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000106 """
107 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000108 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000109 name = gethostname()
110 try:
111 hostname, aliases, ipaddrs = gethostbyaddr(name)
112 except error:
113 pass
114 else:
115 aliases.insert(0, hostname)
116 for name in aliases:
117 if '.' in name:
118 break
119 else:
120 name = hostname
121 return name
122
123
Guido van Rossume5e50592001-08-18 01:23:20 +0000124_socketmethods = (
125 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
126 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Skip Montanaroc6899182003-04-29 19:27:26 +0000127 'sendall', 'setblocking',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000128 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000129
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000130if sys.platform == "riscos":
131 _socketmethods = _socketmethods + ('sleeptaskw',)
132
Martin v. Löwis7596e832006-07-01 15:33:37 +0000133# All the method names that must be delegated to either the real socket
134# object or the _closedsocket object.
135_delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
136 "send", "sendto")
137
Guido van Rossum715f9702002-08-08 18:11:36 +0000138class _closedsocket(object):
139 __slots__ = []
Skip Montanaroc6899182003-04-29 19:27:26 +0000140 def _dummy(*args):
Fred Drake70d566b2003-04-29 19:50:25 +0000141 raise error(EBADF, 'Bad file descriptor')
Martin v. Löwis7596e832006-07-01 15:33:37 +0000142 # All _delegate_methods must also be initialized here.
143 send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
144 __getattr__ = _dummy
Guido van Rossum715f9702002-08-08 18:11:36 +0000145
Martin v. Löwisf25e35b2007-07-27 18:28:22 +0000146# Wrapper around platform socket objects. This implements
147# a platform-independent dup() functionality. The
148# implementation currently relies on reference counting
149# to close the underlying socket object.
Guido van Rossumc18993f2002-08-08 15:16:20 +0000150class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000151
Guido van Rossumc18993f2002-08-08 15:16:20 +0000152 __doc__ = _realsocket.__doc__
153
Martin v. Löwis7596e832006-07-01 15:33:37 +0000154 __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000155
Guido van Rossumc18993f2002-08-08 15:16:20 +0000156 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
157 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000158 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000159 self._sock = _sock
Martin v. Löwis7596e832006-07-01 15:33:37 +0000160 for method in _delegate_methods:
161 setattr(self, method, getattr(_sock, method))
Fred Drakea6070f02000-08-16 14:14:32 +0000162
163 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000164 self._sock = _closedsocket()
Martin v. Löwis7596e832006-07-01 15:33:37 +0000165 dummy = self._sock._dummy
166 for method in _delegate_methods:
167 setattr(self, method, dummy)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000168 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000169
Fred Drakea6070f02000-08-16 14:14:32 +0000170 def accept(self):
171 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000172 return _socketobject(_sock=sock), addr
173 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000174
175 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000176 """dup() -> socket object
177
178 Return a new socket object connected to the same system resource."""
179 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000180
181 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000182 """makefile([mode[, bufsize]]) -> file object
183
184 Return a regular file object corresponding to the socket. The mode
185 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000186 return _fileobject(self._sock, mode, bufsize)
Tim Peters0ae07bd2006-03-22 03:23:21 +0000187
Georg Brandlbb03ac02006-03-21 18:17:25 +0000188 family = property(lambda self: self._sock.family, doc="the socket family")
189 type = property(lambda self: self._sock.type, doc="the socket type")
190 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000191
Guido van Rossumc18993f2002-08-08 15:16:20 +0000192 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
193 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000194 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000195 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000196 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000197
Skip Montanaro89feabc2003-03-30 04:54:24 +0000198socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000199
Guido van Rossumc18993f2002-08-08 15:16:20 +0000200class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000201 """Faux file object attached to a socket object."""
202
203 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000204 name = "<socket>"
205
206 __slots__ = ["mode", "bufsize", "softspace",
207 # "closed" is a property, see below
Georg Brandldd7b0522007-01-21 10:35:10 +0000208 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf",
209 "_close"]
Fred Drakea6070f02000-08-16 14:14:32 +0000210
Georg Brandldd7b0522007-01-21 10:35:10 +0000211 def __init__(self, sock, mode='rb', bufsize=-1, close=False):
Fred Drakea6070f02000-08-16 14:14:32 +0000212 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000213 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000214 if bufsize < 0:
215 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000216 self.bufsize = bufsize
217 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000218 if bufsize == 0:
219 self._rbufsize = 1
220 elif bufsize == 1:
221 self._rbufsize = self.default_bufsize
222 else:
223 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000224 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000225 self._rbuf = "" # A string
226 self._wbuf = [] # A list of strings
Georg Brandldd7b0522007-01-21 10:35:10 +0000227 self._close = close
Fred Drakea6070f02000-08-16 14:14:32 +0000228
Guido van Rossumc18993f2002-08-08 15:16:20 +0000229 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000230 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000231 closed = property(_getclosed, doc="True if the file is closed")
232
Fred Drakea6070f02000-08-16 14:14:32 +0000233 def close(self):
234 try:
235 if self._sock:
236 self.flush()
237 finally:
Georg Brandldd7b0522007-01-21 10:35:10 +0000238 if self._close:
239 self._sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000240 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000241
242 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000243 try:
244 self.close()
245 except:
246 # close() may fail if __init__ didn't complete
247 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000248
249 def flush(self):
250 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000251 buffer = "".join(self._wbuf)
252 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000253 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000254
Neal Norwitz2b342902002-06-13 22:18:39 +0000255 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000256 return self._sock.fileno()
257
258 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000259 data = str(data) # XXX Should really reject non-string non-buffers
260 if not data:
261 return
262 self._wbuf.append(data)
263 if (self._wbufsize == 0 or
264 self._wbufsize == 1 and '\n' in data or
265 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000266 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000267
268 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000269 # XXX We could do better here for very long lists
270 # XXX Should really reject non-string non-buffers
271 self._wbuf.extend(filter(None, map(str, list)))
272 if (self._wbufsize <= 1 or
273 self._get_wbuf_len() >= self._wbufsize):
274 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000275
Guido van Rossum443fec32002-08-08 01:02:16 +0000276 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000277 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000278 for x in self._wbuf:
279 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000280 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000281
Guido van Rossum67f7a382002-06-06 21:08:16 +0000282 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000283 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000284 if size < 0:
285 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000286 buffers = []
287 if data:
288 buffers.append(data)
289 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000290 if self._rbufsize <= 1:
291 recv_size = self.default_bufsize
292 else:
293 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000294 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000295 data = self._sock.recv(recv_size)
296 if not data:
297 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000298 buffers.append(data)
299 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000300 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000301 # Read until size bytes or EOF seen, whichever comes first
302 buf_len = len(data)
303 if buf_len >= size:
304 self._rbuf = data[size:]
305 return data[:size]
306 buffers = []
307 if data:
308 buffers.append(data)
309 self._rbuf = ""
310 while True:
311 left = size - buf_len
312 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000313 data = self._sock.recv(recv_size)
314 if not data:
315 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000316 buffers.append(data)
317 n = len(data)
318 if n >= left:
319 self._rbuf = data[left:]
320 buffers[-1] = data[:left]
321 break
322 buf_len += n
323 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000324
Guido van Rossum67f7a382002-06-06 21:08:16 +0000325 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000326 data = self._rbuf
327 if size < 0:
328 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000329 if self._rbufsize <= 1:
330 # Speed up unbuffered case
331 assert data == ""
332 buffers = []
333 recv = self._sock.recv
334 while data != "\n":
335 data = recv(1)
336 if not data:
337 break
338 buffers.append(data)
339 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000340 nl = data.find('\n')
341 if nl >= 0:
342 nl += 1
343 self._rbuf = data[nl:]
344 return data[:nl]
345 buffers = []
346 if data:
347 buffers.append(data)
348 self._rbuf = ""
349 while True:
350 data = self._sock.recv(self._rbufsize)
351 if not data:
352 break
353 buffers.append(data)
354 nl = data.find('\n')
355 if nl >= 0:
356 nl += 1
357 self._rbuf = data[nl:]
358 buffers[-1] = data[:nl]
359 break
360 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000361 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000362 # Read until size bytes or \n or EOF seen, whichever comes first
363 nl = data.find('\n', 0, size)
364 if nl >= 0:
365 nl += 1
366 self._rbuf = data[nl:]
367 return data[:nl]
368 buf_len = len(data)
369 if buf_len >= size:
370 self._rbuf = data[size:]
371 return data[:size]
372 buffers = []
373 if data:
374 buffers.append(data)
375 self._rbuf = ""
376 while True:
377 data = self._sock.recv(self._rbufsize)
378 if not data:
379 break
380 buffers.append(data)
381 left = size - buf_len
382 nl = data.find('\n', 0, left)
383 if nl >= 0:
384 nl += 1
385 self._rbuf = data[nl:]
386 buffers[-1] = data[:nl]
387 break
388 n = len(data)
389 if n >= left:
390 self._rbuf = data[left:]
391 buffers[-1] = data[:left]
392 break
393 buf_len += n
394 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000395
396 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000397 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000398 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000399 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000400 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000401 if not line:
402 break
Fred Drakea6070f02000-08-16 14:14:32 +0000403 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000404 total += len(line)
405 if sizehint and total >= sizehint:
406 break
Fred Drakea6070f02000-08-16 14:14:32 +0000407 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000408
409 # Iterator protocols
410
411 def __iter__(self):
412 return self
413
414 def next(self):
415 line = self.readline()
416 if not line:
417 raise StopIteration
418 return line
Facundo Batista07c78be2007-03-23 18:54:07 +0000419
420
421def create_connection(address, timeout=None):
422 """Connect to address (host, port) with an optional timeout.
423
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000424 Provides access to socketobject timeout for higher-level
425 protocols. Passing a timeout will set the timeout on the
Facundo Batista07c78be2007-03-23 18:54:07 +0000426 socket instance (if not present, or passed as None, the
427 default global timeout setting will be used).
428 """
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000429
Facundo Batista07c78be2007-03-23 18:54:07 +0000430 msg = "getaddrinfo returns an empty list"
431 host, port = address
432 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
433 af, socktype, proto, canonname, sa = res
434 sock = None
435 try:
436 sock = socket(af, socktype, proto)
437 if timeout is not None:
438 sock.settimeout(timeout)
439 sock.connect(sa)
440 return sock
Neal Norwitz0d4c06e2007-04-25 06:30:05 +0000441
Facundo Batista07c78be2007-03-23 18:54:07 +0000442 except error, msg:
443 if sock is not None:
444 sock.close()
445
446 raise error, msg