blob: e97ce5979f5df85849cf6d0b1f80a93f80be92f1 [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
13fromfd() -- create a socket object from an open file descriptor [*]
14gethostname() -- return the current hostname
15gethostbyname() -- map a hostname to its IP number
16gethostbyaddr() -- map an IP number or hostname to DNS info
17getservbyname() -- map a service name and a protocol name to a port number
18getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number
19ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
20htons(), htonl() -- convert 16, 32 bit int from host to network byte order
21inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
22inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
23ssl() -- secure socket layer support (only available if configured)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000024socket.getdefaulttimeout() -- get the default timeout value
25socket.setdefaulttimeout() -- set the default timeout value
Fred Drakea6070f02000-08-16 14:14:32 +000026
27 [*] not available on all platforms!
28
29Special objects:
30
31SocketType -- type object for socket objects
32error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000033has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000034
35Integer constants:
36
37AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
38SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
39
40Many other constants may be defined; these may be used in calls to
41the setsockopt() and getsockopt() methods.
42"""
43
Tim Peters18e67782002-02-17 04:25:24 +000044import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000045from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000046
Guido van Rossumc18993f2002-08-08 15:16:20 +000047_have_ssl = False
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000048try:
Guido van Rossumde7cade2002-08-08 15:25:28 +000049 import _ssl
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000050 from _ssl import *
Guido van Rossumc18993f2002-08-08 15:16:20 +000051 _have_ssl = True
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000052except ImportError:
Guido van Rossumc18993f2002-08-08 15:16:20 +000053 pass
Fred Drakea6070f02000-08-16 14:14:32 +000054
55import os, sys
56
Fred Drake70d566b2003-04-29 19:50:25 +000057try:
58 from errno import EBADF
59except ImportError:
60 EBADF = 9
61
Skip Montanaro0de65802001-02-15 22:15:14 +000062__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000063__all__.extend(os._get_exports_list(_socket))
Guido van Rossumde7cade2002-08-08 15:25:28 +000064if _have_ssl:
65 __all__.extend(os._get_exports_list(_ssl))
Skip Montanaro0de65802001-02-15 22:15:14 +000066
Guido van Rossumc18993f2002-08-08 15:16:20 +000067_realsocket = socket
Martin v. Löwis1867f242003-06-14 13:30:53 +000068if _have_ssl:
69 _realssl = ssl
70 def ssl(sock, keyfile=None, certfile=None):
71 if hasattr(sock, "_sock"):
72 sock = sock._sock
73 return _realssl(sock, keyfile, certfile)
Fred Drakea6070f02000-08-16 14:14:32 +000074
75# WSA error codes
76if sys.platform.lower().startswith("win"):
77 errorTab = {}
78 errorTab[10004] = "The operation was interrupted."
79 errorTab[10009] = "A bad file handle was passed."
80 errorTab[10013] = "Permission denied."
81 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
82 errorTab[10022] = "An invalid operation was attempted."
83 errorTab[10035] = "The socket operation would block"
84 errorTab[10036] = "A blocking operation is already in progress."
85 errorTab[10048] = "The network address is in use."
86 errorTab[10054] = "The connection has been reset."
87 errorTab[10058] = "The network has been shut down."
88 errorTab[10060] = "The operation timed out."
89 errorTab[10061] = "Connection refused."
90 errorTab[10063] = "The name is too long."
91 errorTab[10064] = "The host is down."
92 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000093 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000094
Fred Drakea6070f02000-08-16 14:14:32 +000095
96
97def getfqdn(name=''):
98 """Get fully qualified domain name from name.
99
100 An empty argument is interpreted as meaning the local host.
101
102 First the hostname returned by gethostbyaddr() is checked, then
103 possibly existing aliases. In case no FQDN is available, hostname
104 is returned.
105 """
106 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000107 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000108 name = gethostname()
109 try:
110 hostname, aliases, ipaddrs = gethostbyaddr(name)
111 except error:
112 pass
113 else:
114 aliases.insert(0, hostname)
115 for name in aliases:
116 if '.' in name:
117 break
118 else:
119 name = hostname
120 return name
121
122
123#
124# These classes are used by the socket() defined on Windows and BeOS
125# platforms to provide a best-effort implementation of the cleanup
126# semantics needed when sockets can't be dup()ed.
127#
128# These are not actually used on other platforms.
129#
130
Guido van Rossume5e50592001-08-18 01:23:20 +0000131_socketmethods = (
132 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
133 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Skip Montanaroc6899182003-04-29 19:27:26 +0000134 'sendall', 'setblocking',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000135 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000136
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000137if sys.platform == "riscos":
138 _socketmethods = _socketmethods + ('sleeptaskw',)
139
Guido van Rossum715f9702002-08-08 18:11:36 +0000140class _closedsocket(object):
141 __slots__ = []
Skip Montanaroc6899182003-04-29 19:27:26 +0000142 def _dummy(*args):
Fred Drake70d566b2003-04-29 19:50:25 +0000143 raise error(EBADF, 'Bad file descriptor')
Skip Montanaroc6899182003-04-29 19:27:26 +0000144 send = recv = sendto = recvfrom = __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
Raymond Hettinger027bb632004-05-31 03:09:25 +0000150 __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom",
151 "__weakref__"]
Guido van Rossumc18993f2002-08-08 15:16:20 +0000152
Guido van Rossumc18993f2002-08-08 15:16:20 +0000153 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
154 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000155 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000156 self._sock = _sock
Skip Montanaroc6899182003-04-29 19:27:26 +0000157 self.send = self._sock.send
158 self.recv = self._sock.recv
159 self.sendto = self._sock.sendto
160 self.recvfrom = self._sock.recvfrom
Fred Drakea6070f02000-08-16 14:14:32 +0000161
162 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000163 self._sock = _closedsocket()
Skip Montanaroc6899182003-04-29 19:27:26 +0000164 self.send = self.recv = self.sendto = self.recvfrom = self._sock._dummy
Guido van Rossumc18993f2002-08-08 15:16:20 +0000165 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000166
Fred Drakea6070f02000-08-16 14:14:32 +0000167 def accept(self):
168 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000169 return _socketobject(_sock=sock), addr
170 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000171
172 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000173 """dup() -> socket object
174
175 Return a new socket object connected to the same system resource."""
176 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000177
178 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000179 """makefile([mode[, bufsize]]) -> file object
180
181 Return a regular file object corresponding to the socket. The mode
182 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000183 return _fileobject(self._sock, mode, bufsize)
184
Guido van Rossumc18993f2002-08-08 15:16:20 +0000185 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
186 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000187 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000188 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000189 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000190
Skip Montanaro89feabc2003-03-30 04:54:24 +0000191socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000193class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000194 """Faux file object attached to a socket object."""
195
196 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000197 name = "<socket>"
198
199 __slots__ = ["mode", "bufsize", "softspace",
200 # "closed" is a property, see below
201 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000202
Guido van Rossume9f66142002-08-07 15:46:19 +0000203 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000204 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000205 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000206 if bufsize < 0:
207 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000208 self.bufsize = bufsize
209 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000210 if bufsize == 0:
211 self._rbufsize = 1
212 elif bufsize == 1:
213 self._rbufsize = self.default_bufsize
214 else:
215 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000216 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000217 self._rbuf = "" # A string
218 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000219
Guido van Rossumc18993f2002-08-08 15:16:20 +0000220 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000221 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000222 closed = property(_getclosed, doc="True if the file is closed")
223
Fred Drakea6070f02000-08-16 14:14:32 +0000224 def close(self):
225 try:
226 if self._sock:
227 self.flush()
228 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000229 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000230
231 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000232 try:
233 self.close()
234 except:
235 # close() may fail if __init__ didn't complete
236 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000237
238 def flush(self):
239 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000240 buffer = "".join(self._wbuf)
241 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000242 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000243
Neal Norwitz2b342902002-06-13 22:18:39 +0000244 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000245 return self._sock.fileno()
246
247 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000248 data = str(data) # XXX Should really reject non-string non-buffers
249 if not data:
250 return
251 self._wbuf.append(data)
252 if (self._wbufsize == 0 or
253 self._wbufsize == 1 and '\n' in data or
254 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000255 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000256
257 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000258 # XXX We could do better here for very long lists
259 # XXX Should really reject non-string non-buffers
260 self._wbuf.extend(filter(None, map(str, list)))
261 if (self._wbufsize <= 1 or
262 self._get_wbuf_len() >= self._wbufsize):
263 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000264
Guido van Rossum443fec32002-08-08 01:02:16 +0000265 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000266 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000267 for x in self._wbuf:
268 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000269 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000270
Guido van Rossum67f7a382002-06-06 21:08:16 +0000271 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000272 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000273 if size < 0:
274 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000275 buffers = []
276 if data:
277 buffers.append(data)
278 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000279 if self._rbufsize <= 1:
280 recv_size = self.default_bufsize
281 else:
282 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000283 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000284 data = self._sock.recv(recv_size)
285 if not data:
286 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000287 buffers.append(data)
288 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000289 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000290 # Read until size bytes or EOF seen, whichever comes first
291 buf_len = len(data)
292 if buf_len >= size:
293 self._rbuf = data[size:]
294 return data[:size]
295 buffers = []
296 if data:
297 buffers.append(data)
298 self._rbuf = ""
299 while True:
300 left = size - buf_len
301 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000302 data = self._sock.recv(recv_size)
303 if not data:
304 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000305 buffers.append(data)
306 n = len(data)
307 if n >= left:
308 self._rbuf = data[left:]
309 buffers[-1] = data[:left]
310 break
311 buf_len += n
312 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000313
Guido van Rossum67f7a382002-06-06 21:08:16 +0000314 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000315 data = self._rbuf
316 if size < 0:
317 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000318 if self._rbufsize <= 1:
319 # Speed up unbuffered case
320 assert data == ""
321 buffers = []
322 recv = self._sock.recv
323 while data != "\n":
324 data = recv(1)
325 if not data:
326 break
327 buffers.append(data)
328 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000329 nl = data.find('\n')
330 if nl >= 0:
331 nl += 1
332 self._rbuf = data[nl:]
333 return data[:nl]
334 buffers = []
335 if data:
336 buffers.append(data)
337 self._rbuf = ""
338 while True:
339 data = self._sock.recv(self._rbufsize)
340 if not data:
341 break
342 buffers.append(data)
343 nl = data.find('\n')
344 if nl >= 0:
345 nl += 1
346 self._rbuf = data[nl:]
347 buffers[-1] = data[:nl]
348 break
349 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000350 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000351 # Read until size bytes or \n or EOF seen, whichever comes first
352 nl = data.find('\n', 0, size)
353 if nl >= 0:
354 nl += 1
355 self._rbuf = data[nl:]
356 return data[:nl]
357 buf_len = len(data)
358 if buf_len >= size:
359 self._rbuf = data[size:]
360 return data[:size]
361 buffers = []
362 if data:
363 buffers.append(data)
364 self._rbuf = ""
365 while True:
366 data = self._sock.recv(self._rbufsize)
367 if not data:
368 break
369 buffers.append(data)
370 left = size - buf_len
371 nl = data.find('\n', 0, left)
372 if nl >= 0:
373 nl += 1
374 self._rbuf = data[nl:]
375 buffers[-1] = data[:nl]
376 break
377 n = len(data)
378 if n >= left:
379 self._rbuf = data[left:]
380 buffers[-1] = data[:left]
381 break
382 buf_len += n
383 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000384
385 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000386 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000387 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000388 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000389 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000390 if not line:
391 break
Fred Drakea6070f02000-08-16 14:14:32 +0000392 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000393 total += len(line)
394 if sizehint and total >= sizehint:
395 break
Fred Drakea6070f02000-08-16 14:14:32 +0000396 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000397
398 # Iterator protocols
399
400 def __iter__(self):
401 return self
402
403 def next(self):
404 line = self.readline()
405 if not line:
406 raise StopIteration
407 return line