blob: b95c372da5f3301fee90853781a5593ab0d18bb9 [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
Fred Drakea6070f02000-08-16 14:14:32 +000068if (sys.platform.lower().startswith("win")
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000069 or (hasattr(os, 'uname') and os.uname()[0] == "BeOS")
Tim Peters18e67782002-02-17 04:25:24 +000070 or sys.platform=="riscos"):
Fred Drakea6070f02000-08-16 14:14:32 +000071
Guido van Rossumc18993f2002-08-08 15:16:20 +000072 if _have_ssl:
73 _realssl = ssl
Guido van Rossum3f69f212001-03-22 22:12:17 +000074 def ssl(sock, keyfile=None, certfile=None):
75 if hasattr(sock, "_sock"):
76 sock = sock._sock
Guido van Rossumc18993f2002-08-08 15:16:20 +000077 return _realssl(sock, keyfile, certfile)
Fred Drakea6070f02000-08-16 14:14:32 +000078
79# WSA error codes
80if sys.platform.lower().startswith("win"):
81 errorTab = {}
82 errorTab[10004] = "The operation was interrupted."
83 errorTab[10009] = "A bad file handle was passed."
84 errorTab[10013] = "Permission denied."
85 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
86 errorTab[10022] = "An invalid operation was attempted."
87 errorTab[10035] = "The socket operation would block"
88 errorTab[10036] = "A blocking operation is already in progress."
89 errorTab[10048] = "The network address is in use."
90 errorTab[10054] = "The connection has been reset."
91 errorTab[10058] = "The network has been shut down."
92 errorTab[10060] = "The operation timed out."
93 errorTab[10061] = "Connection refused."
94 errorTab[10063] = "The name is too long."
95 errorTab[10064] = "The host is down."
96 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000097 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000098
Fred Drakea6070f02000-08-16 14:14:32 +000099
100
101def getfqdn(name=''):
102 """Get fully qualified domain name from name.
103
104 An empty argument is interpreted as meaning the local host.
105
106 First the hostname returned by gethostbyaddr() is checked, then
107 possibly existing aliases. In case no FQDN is available, hostname
108 is returned.
109 """
110 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000111 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000112 name = gethostname()
113 try:
114 hostname, aliases, ipaddrs = gethostbyaddr(name)
115 except error:
116 pass
117 else:
118 aliases.insert(0, hostname)
119 for name in aliases:
120 if '.' in name:
121 break
122 else:
123 name = hostname
124 return name
125
126
127#
128# These classes are used by the socket() defined on Windows and BeOS
129# platforms to provide a best-effort implementation of the cleanup
130# semantics needed when sockets can't be dup()ed.
131#
132# These are not actually used on other platforms.
133#
134
Guido van Rossume5e50592001-08-18 01:23:20 +0000135_socketmethods = (
136 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
137 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Skip Montanaroc6899182003-04-29 19:27:26 +0000138 'sendall', 'setblocking',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000139 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000140
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000141if sys.platform == "riscos":
142 _socketmethods = _socketmethods + ('sleeptaskw',)
143
Guido van Rossum715f9702002-08-08 18:11:36 +0000144class _closedsocket(object):
145 __slots__ = []
Skip Montanaroc6899182003-04-29 19:27:26 +0000146 def _dummy(*args):
Fred Drake70d566b2003-04-29 19:50:25 +0000147 raise error(EBADF, 'Bad file descriptor')
Skip Montanaroc6899182003-04-29 19:27:26 +0000148 send = recv = sendto = recvfrom = __getattr__ = _dummy
Guido van Rossum715f9702002-08-08 18:11:36 +0000149
Guido van Rossumc18993f2002-08-08 15:16:20 +0000150class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000151
Guido van Rossumc18993f2002-08-08 15:16:20 +0000152 __doc__ = _realsocket.__doc__
153
Skip Montanaroc6899182003-04-29 19:27:26 +0000154 __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom"]
Guido van Rossumc18993f2002-08-08 15:16:20 +0000155
Guido van Rossumc18993f2002-08-08 15:16:20 +0000156 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
157 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000158 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000159 self._sock = _sock
Skip Montanaroc6899182003-04-29 19:27:26 +0000160 self.send = self._sock.send
161 self.recv = self._sock.recv
162 self.sendto = self._sock.sendto
163 self.recvfrom = self._sock.recvfrom
Fred Drakea6070f02000-08-16 14:14:32 +0000164
165 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000166 self._sock = _closedsocket()
Skip Montanaroc6899182003-04-29 19:27:26 +0000167 self.send = self.recv = self.sendto = self.recvfrom = self._sock._dummy
Guido van Rossumc18993f2002-08-08 15:16:20 +0000168 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000169
Fred Drakea6070f02000-08-16 14:14:32 +0000170 def accept(self):
171 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000172 return _socketobject(_sock=sock), addr
173 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000174
175 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000176 """dup() -> socket object
177
178 Return a new socket object connected to the same system resource."""
179 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000180
181 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000182 """makefile([mode[, bufsize]]) -> file object
183
184 Return a regular file object corresponding to the socket. The mode
185 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000186 return _fileobject(self._sock, mode, bufsize)
187
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):
224 return self._sock is not None
225 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