blob: eff47d2bf74a669f21e25f2265a32cf7a5bf1661 [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
205 __slots__ = ["mode", "bufsize", "softspace",
206 # "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
216 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000217 if bufsize == 0:
218 self._rbufsize = 1
219 elif bufsize == 1:
220 self._rbufsize = self.default_bufsize
221 else:
222 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000223 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000224 self._rbuf = "" # A string
225 self._wbuf = [] # A list of strings
Thomas Woutersb2137042007-02-01 18:02:27 +0000226 self._close = close
Fred Drakea6070f02000-08-16 14:14:32 +0000227
Guido van Rossumc18993f2002-08-08 15:16:20 +0000228 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000229 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000230 closed = property(_getclosed, doc="True if the file is closed")
231
Fred Drakea6070f02000-08-16 14:14:32 +0000232 def close(self):
233 try:
234 if self._sock:
235 self.flush()
236 finally:
Thomas Woutersb2137042007-02-01 18:02:27 +0000237 if self._close:
238 self._sock.close()
Guido van Rossum67f7a382002-06-06 21:08:16 +0000239 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000240
241 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000242 try:
243 self.close()
244 except:
245 # close() may fail if __init__ didn't complete
246 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000247
248 def flush(self):
249 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000250 buffer = "".join(self._wbuf)
251 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000252 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000253
Neal Norwitz2b342902002-06-13 22:18:39 +0000254 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000255 return self._sock.fileno()
256
257 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000258 data = str(data) # XXX Should really reject non-string non-buffers
259 if not data:
260 return
261 self._wbuf.append(data)
262 if (self._wbufsize == 0 or
263 self._wbufsize == 1 and '\n' in data or
264 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000265 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000266
267 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000268 # XXX We could do better here for very long lists
269 # XXX Should really reject non-string non-buffers
270 self._wbuf.extend(filter(None, map(str, list)))
271 if (self._wbufsize <= 1 or
272 self._get_wbuf_len() >= self._wbufsize):
273 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000274
Guido van Rossum443fec32002-08-08 01:02:16 +0000275 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000276 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000277 for x in self._wbuf:
278 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000279 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000280
Guido van Rossum67f7a382002-06-06 21:08:16 +0000281 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000282 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000283 if size < 0:
284 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000285 buffers = []
286 if data:
287 buffers.append(data)
288 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000289 if self._rbufsize <= 1:
290 recv_size = self.default_bufsize
291 else:
292 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000293 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000294 data = self._sock.recv(recv_size)
295 if not data:
296 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000297 buffers.append(data)
298 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000299 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000300 # Read until size bytes or EOF seen, whichever comes first
301 buf_len = len(data)
302 if buf_len >= size:
303 self._rbuf = data[size:]
304 return data[:size]
305 buffers = []
306 if data:
307 buffers.append(data)
308 self._rbuf = ""
309 while True:
310 left = size - buf_len
311 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000312 data = self._sock.recv(recv_size)
313 if not data:
314 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000315 buffers.append(data)
316 n = len(data)
317 if n >= left:
318 self._rbuf = data[left:]
319 buffers[-1] = data[:left]
320 break
321 buf_len += n
322 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000323
Guido van Rossum67f7a382002-06-06 21:08:16 +0000324 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000325 data = self._rbuf
326 if size < 0:
327 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000328 if self._rbufsize <= 1:
329 # Speed up unbuffered case
330 assert data == ""
331 buffers = []
332 recv = self._sock.recv
333 while data != "\n":
334 data = recv(1)
335 if not data:
336 break
337 buffers.append(data)
338 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000339 nl = data.find('\n')
340 if nl >= 0:
341 nl += 1
342 self._rbuf = data[nl:]
343 return data[:nl]
344 buffers = []
345 if data:
346 buffers.append(data)
347 self._rbuf = ""
348 while True:
349 data = self._sock.recv(self._rbufsize)
350 if not data:
351 break
352 buffers.append(data)
353 nl = data.find('\n')
354 if nl >= 0:
355 nl += 1
356 self._rbuf = data[nl:]
357 buffers[-1] = data[:nl]
358 break
359 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000360 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000361 # Read until size bytes or \n or EOF seen, whichever comes first
362 nl = data.find('\n', 0, size)
363 if nl >= 0:
364 nl += 1
365 self._rbuf = data[nl:]
366 return data[:nl]
367 buf_len = len(data)
368 if buf_len >= size:
369 self._rbuf = data[size:]
370 return data[:size]
371 buffers = []
372 if data:
373 buffers.append(data)
374 self._rbuf = ""
375 while True:
376 data = self._sock.recv(self._rbufsize)
377 if not data:
378 break
379 buffers.append(data)
380 left = size - buf_len
381 nl = data.find('\n', 0, left)
382 if nl >= 0:
383 nl += 1
384 self._rbuf = data[nl:]
385 buffers[-1] = data[:nl]
386 break
387 n = len(data)
388 if n >= left:
389 self._rbuf = data[left:]
390 buffers[-1] = data[:left]
391 break
392 buf_len += n
393 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000394
395 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000396 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000397 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000398 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000399 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000400 if not line:
401 break
Fred Drakea6070f02000-08-16 14:14:32 +0000402 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000403 total += len(line)
404 if sizehint and total >= sizehint:
405 break
Fred Drakea6070f02000-08-16 14:14:32 +0000406 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000407
408 # Iterator protocols
409
410 def __iter__(self):
411 return self
412
413 def next(self):
414 line = self.readline()
415 if not line:
416 raise StopIteration
417 return line