blob: 2222600721c3a754487ad24488fa5d4da83634cd [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
Thomas Wouters0e3f5912006-08-11 14:57:12 +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')
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000142 def close(self):
143 pass
144 # All _delegate_methods must also be initialized here.
145 send = recv = recv_into = sendto = recvfrom = recvfrom_into = _dummy
146 __getattr__ = _dummy
Guido van Rossum715f9702002-08-08 18:11:36 +0000147
Guido van Rossumc18993f2002-08-08 15:16:20 +0000148class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000149
Guido van Rossumc18993f2002-08-08 15:16:20 +0000150 __doc__ = _realsocket.__doc__
151
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000152 __slots__ = ["_sock", "__weakref__"] + list(_delegate_methods)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000153
Guido van Rossumc18993f2002-08-08 15:16:20 +0000154 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
155 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000156 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000157 self._sock = _sock
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000158 for method in _delegate_methods:
159 setattr(self, method, getattr(_sock, method))
Fred Drakea6070f02000-08-16 14:14:32 +0000160
161 def close(self):
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000162 self._sock.close()
Guido van Rossum715f9702002-08-08 18:11:36 +0000163 self._sock = _closedsocket()
Thomas Wouters0e3f5912006-08-11 14:57:12 +0000164 dummy = self._sock._dummy
165 for method in _delegate_methods:
166 setattr(self, method, dummy)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000167 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000168
Fred Drakea6070f02000-08-16 14:14:32 +0000169 def accept(self):
170 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000171 return _socketobject(_sock=sock), addr
172 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000173
174 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000175 """dup() -> socket object
176
177 Return a new socket object connected to the same system resource."""
178 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000179
180 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000181 """makefile([mode[, bufsize]]) -> file object
182
183 Return a regular file object corresponding to the socket. The mode
184 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000185 return _fileobject(self._sock, mode, bufsize)
186
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000187 family = property(lambda self: self._sock.family, doc="the socket family")
188 type = property(lambda self: self._sock.type, doc="the socket type")
189 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
190
Guido van Rossumc18993f2002-08-08 15:16:20 +0000191 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
192 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000193 for _m in _socketmethods:
Georg Brandl7cae87c2006-09-06 06:51:57 +0000194 exec(_s % (_m, _m, _m, _m))
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000195 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000196
Skip Montanaro89feabc2003-03-30 04:54:24 +0000197socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000198
Guido van Rossumc18993f2002-08-08 15:16:20 +0000199class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000200 """Faux file object attached to a socket object."""
201
202 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000203 name = "<socket>"
204
Guido van Rossum79139b22007-02-09 23:20:19 +0000205 __slots__ = ["mode", "bufsize",
Guido van Rossumc18993f2002-08-08 15:16:20 +0000206 # "closed" is a property, see below
Thomas Woutersb2137042007-02-01 18:02:27 +0000207 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf",
208 "_close"]
Fred Drakea6070f02000-08-16 14:14:32 +0000209
Thomas Woutersb2137042007-02-01 18:02:27 +0000210 def __init__(self, sock, mode='rb', bufsize=-1, close=False):
Fred Drakea6070f02000-08-16 14:14:32 +0000211 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000212 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000213 if bufsize < 0:
214 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000215 self.bufsize = bufsize
Guido van Rossum443fec32002-08-08 01:02:16 +0000216 if bufsize == 0:
217 self._rbufsize = 1
218 elif bufsize == 1:
219 self._rbufsize = self.default_bufsize
220 else:
221 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000222 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000223 self._rbuf = "" # A string
224 self._wbuf = [] # A list of strings
Thomas Woutersb2137042007-02-01 18:02:27 +0000225 self._close = close
Fred Drakea6070f02000-08-16 14:14:32 +0000226
Guido van Rossumc18993f2002-08-08 15:16:20 +0000227 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000228 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000229 closed = property(_getclosed, doc="True if the file is closed")
230
Fred Drakea6070f02000-08-16 14:14:32 +0000231 def close(self):
232 try:
233 if self._sock:
234 self.flush()
235 finally:
Thomas Woutersb2137042007-02-01 18:02:27 +0000236 if self._close:
237 self._sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000238 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000239
240 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000241 try:
242 self.close()
243 except:
244 # close() may fail if __init__ didn't complete
245 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000246
247 def flush(self):
248 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000249 buffer = "".join(self._wbuf)
250 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000251 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000252
Neal Norwitz2b342902002-06-13 22:18:39 +0000253 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000254 return self._sock.fileno()
255
256 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000257 data = str(data) # XXX Should really reject non-string non-buffers
258 if not data:
259 return
260 self._wbuf.append(data)
261 if (self._wbufsize == 0 or
262 self._wbufsize == 1 and '\n' in data or
263 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000264 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000265
266 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000267 # XXX We could do better here for very long lists
268 # XXX Should really reject non-string non-buffers
269 self._wbuf.extend(filter(None, map(str, list)))
270 if (self._wbufsize <= 1 or
271 self._get_wbuf_len() >= self._wbufsize):
272 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000273
Guido van Rossum443fec32002-08-08 01:02:16 +0000274 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000275 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000276 for x in self._wbuf:
277 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000278 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000279
Guido van Rossum67f7a382002-06-06 21:08:16 +0000280 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000281 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000282 if size < 0:
283 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000284 buffers = []
285 if data:
286 buffers.append(data)
287 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000288 if self._rbufsize <= 1:
289 recv_size = self.default_bufsize
290 else:
291 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000292 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000293 data = self._sock.recv(recv_size)
294 if not data:
295 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000296 buffers.append(data)
297 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000298 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000299 # Read until size bytes or EOF seen, whichever comes first
300 buf_len = len(data)
301 if buf_len >= size:
302 self._rbuf = data[size:]
303 return data[:size]
304 buffers = []
305 if data:
306 buffers.append(data)
307 self._rbuf = ""
308 while True:
309 left = size - buf_len
310 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000311 data = self._sock.recv(recv_size)
312 if not data:
313 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000314 buffers.append(data)
315 n = len(data)
316 if n >= left:
317 self._rbuf = data[left:]
318 buffers[-1] = data[:left]
319 break
320 buf_len += n
321 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000322
Guido van Rossum67f7a382002-06-06 21:08:16 +0000323 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000324 data = self._rbuf
325 if size < 0:
326 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000327 if self._rbufsize <= 1:
328 # Speed up unbuffered case
329 assert data == ""
330 buffers = []
331 recv = self._sock.recv
332 while data != "\n":
333 data = recv(1)
334 if not data:
335 break
336 buffers.append(data)
337 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000338 nl = data.find('\n')
339 if nl >= 0:
340 nl += 1
341 self._rbuf = data[nl:]
342 return data[:nl]
343 buffers = []
344 if data:
345 buffers.append(data)
346 self._rbuf = ""
347 while True:
348 data = self._sock.recv(self._rbufsize)
349 if not data:
350 break
351 buffers.append(data)
352 nl = data.find('\n')
353 if nl >= 0:
354 nl += 1
355 self._rbuf = data[nl:]
356 buffers[-1] = data[:nl]
357 break
358 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000359 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000360 # Read until size bytes or \n or EOF seen, whichever comes first
361 nl = data.find('\n', 0, size)
362 if nl >= 0:
363 nl += 1
364 self._rbuf = data[nl:]
365 return data[:nl]
366 buf_len = len(data)
367 if buf_len >= size:
368 self._rbuf = data[size:]
369 return data[:size]
370 buffers = []
371 if data:
372 buffers.append(data)
373 self._rbuf = ""
374 while True:
375 data = self._sock.recv(self._rbufsize)
376 if not data:
377 break
378 buffers.append(data)
379 left = size - buf_len
380 nl = data.find('\n', 0, left)
381 if nl >= 0:
382 nl += 1
383 self._rbuf = data[nl:]
384 buffers[-1] = data[:nl]
385 break
386 n = len(data)
387 if n >= left:
388 self._rbuf = data[left:]
389 buffers[-1] = data[:left]
390 break
391 buf_len += n
392 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000393
394 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000395 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000396 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000397 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000398 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000399 if not line:
400 break
Fred Drakea6070f02000-08-16 14:14:32 +0000401 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000402 total += len(line)
403 if sizehint and total >= sizehint:
404 break
Fred Drakea6070f02000-08-16 14:14:32 +0000405 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000406
407 # Iterator protocols
408
409 def __iter__(self):
410 return self
411
412 def next(self):
413 line = self.readline()
414 if not line:
415 raise StopIteration
416 return line