blob: 0082e7656e2084bafa43b7467716ab540feacc66 [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
Fred Drakea6070f02000-08-16 14:14:32 +000027
28 [*] not available on all platforms!
29
30Special objects:
31
32SocketType -- type object for socket objects
33error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000034has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000035
36Integer constants:
37
38AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
39SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
40
41Many other constants may be defined; these may be used in calls to
42the setsockopt() and getsockopt() methods.
43"""
44
Tim Peters18e67782002-02-17 04:25:24 +000045import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000046from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000047
Guido van Rossumc18993f2002-08-08 15:16:20 +000048_have_ssl = False
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000049try:
Guido van Rossumde7cade2002-08-08 15:25:28 +000050 import _ssl
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000051 from _ssl import *
Guido van Rossumc18993f2002-08-08 15:16:20 +000052 _have_ssl = True
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000053except ImportError:
Guido van Rossumc18993f2002-08-08 15:16:20 +000054 pass
Fred Drakea6070f02000-08-16 14:14:32 +000055
56import os, sys
57
Fred Drake70d566b2003-04-29 19:50:25 +000058try:
59 from errno import EBADF
60except ImportError:
61 EBADF = 9
62
Skip Montanaro0de65802001-02-15 22:15:14 +000063__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000064__all__.extend(os._get_exports_list(_socket))
Guido van Rossumde7cade2002-08-08 15:25:28 +000065if _have_ssl:
66 __all__.extend(os._get_exports_list(_ssl))
Skip Montanaro0de65802001-02-15 22:15:14 +000067
Guido van Rossumc18993f2002-08-08 15:16:20 +000068_realsocket = socket
Martin v. Löwis1867f242003-06-14 13:30:53 +000069if _have_ssl:
70 _realssl = ssl
71 def ssl(sock, keyfile=None, certfile=None):
72 if hasattr(sock, "_sock"):
73 sock = sock._sock
74 return _realssl(sock, keyfile, certfile)
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
Guido van Rossumc18993f2002-08-08 15:16:20 +0000146class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000147
Guido van Rossumc18993f2002-08-08 15:16:20 +0000148 __doc__ = _realsocket.__doc__
149
Martin v. Löwis7596e832006-07-01 15:33:37 +0000150 __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000151
Guido van Rossumc18993f2002-08-08 15:16:20 +0000152 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
153 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000154 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000155 self._sock = _sock
Martin v. Löwis7596e832006-07-01 15:33:37 +0000156 for method in _delegate_methods:
157 setattr(self, method, getattr(_sock, method))
Fred Drakea6070f02000-08-16 14:14:32 +0000158
159 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000160 self._sock = _closedsocket()
Martin v. Löwis7596e832006-07-01 15:33:37 +0000161 dummy = self._sock._dummy
162 for method in _delegate_methods:
163 setattr(self, method, dummy)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000164 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000165
Fred Drakea6070f02000-08-16 14:14:32 +0000166 def accept(self):
167 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000168 return _socketobject(_sock=sock), addr
169 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000170
171 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000172 """dup() -> socket object
173
174 Return a new socket object connected to the same system resource."""
175 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000176
177 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000178 """makefile([mode[, bufsize]]) -> file object
179
180 Return a regular file object corresponding to the socket. The mode
181 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000182 return _fileobject(self._sock, mode, bufsize)
Tim Peters0ae07bd2006-03-22 03:23:21 +0000183
Georg Brandlbb03ac02006-03-21 18:17:25 +0000184 family = property(lambda self: self._sock.family, doc="the socket family")
185 type = property(lambda self: self._sock.type, doc="the socket type")
186 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000187
Guido van Rossumc18993f2002-08-08 15:16:20 +0000188 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
189 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000190 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000191 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000192 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000193
Skip Montanaro89feabc2003-03-30 04:54:24 +0000194socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000195
Guido van Rossumc18993f2002-08-08 15:16:20 +0000196class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000197 """Faux file object attached to a socket object."""
198
199 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000200 name = "<socket>"
201
202 __slots__ = ["mode", "bufsize", "softspace",
203 # "closed" is a property, see below
Georg Brandl962e9162007-01-21 10:35:14 +0000204 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf",
205 "_close"]
Fred Drakea6070f02000-08-16 14:14:32 +0000206
Georg Brandl962e9162007-01-21 10:35:14 +0000207 def __init__(self, sock, mode='rb', bufsize=-1, close=False):
Fred Drakea6070f02000-08-16 14:14:32 +0000208 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000209 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000210 if bufsize < 0:
211 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000212 self.bufsize = bufsize
213 self.softspace = False
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
Georg Brandl962e9162007-01-21 10:35:14 +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:
Georg Brandl962e9162007-01-21 10:35:14 +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
410 def next(self):
411 line = self.readline()
412 if not line:
413 raise StopIteration
414 return line