blob: 4e83f099a281aabb21f4dd819d6078bc1997a91d [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
204 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000205
Guido van Rossume9f66142002-08-07 15:46:19 +0000206 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000207 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000208 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000209 if bufsize < 0:
210 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000211 self.bufsize = bufsize
212 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000213 if bufsize == 0:
214 self._rbufsize = 1
215 elif bufsize == 1:
216 self._rbufsize = self.default_bufsize
217 else:
218 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000219 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000220 self._rbuf = "" # A string
221 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000222
Guido van Rossumc18993f2002-08-08 15:16:20 +0000223 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000224 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000225 closed = property(_getclosed, doc="True if the file is closed")
226
Fred Drakea6070f02000-08-16 14:14:32 +0000227 def close(self):
228 try:
229 if self._sock:
230 self.flush()
231 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000232 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000233
234 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000235 try:
236 self.close()
237 except:
238 # close() may fail if __init__ didn't complete
239 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000240
241 def flush(self):
242 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000243 buffer = "".join(self._wbuf)
244 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000245 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000246
Neal Norwitz2b342902002-06-13 22:18:39 +0000247 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000248 return self._sock.fileno()
249
250 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000251 data = str(data) # XXX Should really reject non-string non-buffers
252 if not data:
253 return
254 self._wbuf.append(data)
255 if (self._wbufsize == 0 or
256 self._wbufsize == 1 and '\n' in data or
257 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000258 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000259
260 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000261 # XXX We could do better here for very long lists
262 # XXX Should really reject non-string non-buffers
263 self._wbuf.extend(filter(None, map(str, list)))
264 if (self._wbufsize <= 1 or
265 self._get_wbuf_len() >= self._wbufsize):
266 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000267
Guido van Rossum443fec32002-08-08 01:02:16 +0000268 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000269 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000270 for x in self._wbuf:
271 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000272 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000273
Guido van Rossum67f7a382002-06-06 21:08:16 +0000274 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000275 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000276 if size < 0:
277 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000278 buffers = []
279 if data:
280 buffers.append(data)
281 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000282 if self._rbufsize <= 1:
283 recv_size = self.default_bufsize
284 else:
285 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000286 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000287 data = self._sock.recv(recv_size)
288 if not data:
289 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000290 buffers.append(data)
291 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000292 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000293 # Read until size bytes or EOF seen, whichever comes first
294 buf_len = len(data)
295 if buf_len >= size:
296 self._rbuf = data[size:]
297 return data[:size]
298 buffers = []
299 if data:
300 buffers.append(data)
301 self._rbuf = ""
302 while True:
303 left = size - buf_len
304 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000305 data = self._sock.recv(recv_size)
306 if not data:
307 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000308 buffers.append(data)
309 n = len(data)
310 if n >= left:
311 self._rbuf = data[left:]
312 buffers[-1] = data[:left]
313 break
314 buf_len += n
315 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000316
Guido van Rossum67f7a382002-06-06 21:08:16 +0000317 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000318 data = self._rbuf
319 if size < 0:
320 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000321 if self._rbufsize <= 1:
322 # Speed up unbuffered case
323 assert data == ""
324 buffers = []
325 recv = self._sock.recv
326 while data != "\n":
327 data = recv(1)
328 if not data:
329 break
330 buffers.append(data)
331 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000332 nl = data.find('\n')
333 if nl >= 0:
334 nl += 1
335 self._rbuf = data[nl:]
336 return data[:nl]
337 buffers = []
338 if data:
339 buffers.append(data)
340 self._rbuf = ""
341 while True:
342 data = self._sock.recv(self._rbufsize)
343 if not data:
344 break
345 buffers.append(data)
346 nl = data.find('\n')
347 if nl >= 0:
348 nl += 1
349 self._rbuf = data[nl:]
350 buffers[-1] = data[:nl]
351 break
352 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000353 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000354 # Read until size bytes or \n or EOF seen, whichever comes first
355 nl = data.find('\n', 0, size)
356 if nl >= 0:
357 nl += 1
358 self._rbuf = data[nl:]
359 return data[:nl]
360 buf_len = len(data)
361 if buf_len >= size:
362 self._rbuf = data[size:]
363 return data[:size]
364 buffers = []
365 if data:
366 buffers.append(data)
367 self._rbuf = ""
368 while True:
369 data = self._sock.recv(self._rbufsize)
370 if not data:
371 break
372 buffers.append(data)
373 left = size - buf_len
374 nl = data.find('\n', 0, left)
375 if nl >= 0:
376 nl += 1
377 self._rbuf = data[nl:]
378 buffers[-1] = data[:nl]
379 break
380 n = len(data)
381 if n >= left:
382 self._rbuf = data[left:]
383 buffers[-1] = data[:left]
384 break
385 buf_len += n
386 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000387
388 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000389 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000390 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000391 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000392 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000393 if not line:
394 break
Fred Drakea6070f02000-08-16 14:14:32 +0000395 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000396 total += len(line)
397 if sizehint and total >= sizehint:
398 break
Fred Drakea6070f02000-08-16 14:14:32 +0000399 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000400
401 # Iterator protocols
402
403 def __iter__(self):
404 return self
405
406 def next(self):
407 line = self.readline()
408 if not line:
409 raise StopIteration
410 return line