blob: 73b477dccd9b8d30936230c57d3222a94e2e1953 [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
124#
125# These classes are used by the socket() defined on Windows and BeOS
126# platforms to provide a best-effort implementation of the cleanup
127# semantics needed when sockets can't be dup()ed.
128#
129# These are not actually used on other platforms.
130#
131
Guido van Rossume5e50592001-08-18 01:23:20 +0000132_socketmethods = (
133 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
134 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Skip Montanaroc6899182003-04-29 19:27:26 +0000135 'sendall', 'setblocking',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000136 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000137
Martin v. Löwisa94568a2003-05-10 07:36:56 +0000138if sys.platform == "riscos":
139 _socketmethods = _socketmethods + ('sleeptaskw',)
140
Guido van Rossum715f9702002-08-08 18:11:36 +0000141class _closedsocket(object):
142 __slots__ = []
Skip Montanaroc6899182003-04-29 19:27:26 +0000143 def _dummy(*args):
Fred Drake70d566b2003-04-29 19:50:25 +0000144 raise error(EBADF, 'Bad file descriptor')
Skip Montanaroc6899182003-04-29 19:27:26 +0000145 send = recv = sendto = recvfrom = __getattr__ = _dummy
Guido van Rossum715f9702002-08-08 18:11:36 +0000146
Guido van Rossumc18993f2002-08-08 15:16:20 +0000147class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000148
Guido van Rossumc18993f2002-08-08 15:16:20 +0000149 __doc__ = _realsocket.__doc__
150
Raymond Hettinger027bb632004-05-31 03:09:25 +0000151 __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom",
152 "__weakref__"]
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
Skip Montanaroc6899182003-04-29 19:27:26 +0000158 self.send = self._sock.send
159 self.recv = self._sock.recv
160 self.sendto = self._sock.sendto
161 self.recvfrom = self._sock.recvfrom
Fred Drakea6070f02000-08-16 14:14:32 +0000162
163 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000164 self._sock = _closedsocket()
Skip Montanaroc6899182003-04-29 19:27:26 +0000165 self.send = self.recv = self.sendto = self.recvfrom = self._sock._dummy
Guido van Rossumc18993f2002-08-08 15:16:20 +0000166 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000167
Fred Drakea6070f02000-08-16 14:14:32 +0000168 def accept(self):
169 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000170 return _socketobject(_sock=sock), addr
171 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000172
173 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000174 """dup() -> socket object
175
176 Return a new socket object connected to the same system resource."""
177 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000178
179 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000180 """makefile([mode[, bufsize]]) -> file object
181
182 Return a regular file object corresponding to the socket. The mode
183 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000184 return _fileobject(self._sock, mode, bufsize)
Tim Peters0ae07bd2006-03-22 03:23:21 +0000185
Georg Brandlbb03ac02006-03-21 18:17:25 +0000186 family = property(lambda self: self._sock.family, doc="the socket family")
187 type = property(lambda self: self._sock.type, doc="the socket type")
188 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
Georg Brandlbc45a3f2006-03-17 19:17:34 +0000189
Guido van Rossumc18993f2002-08-08 15:16:20 +0000190 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
191 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000192 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000193 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000194 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000195
Skip Montanaro89feabc2003-03-30 04:54:24 +0000196socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000197
Guido van Rossumc18993f2002-08-08 15:16:20 +0000198class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000199 """Faux file object attached to a socket object."""
200
201 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000202 name = "<socket>"
203
204 __slots__ = ["mode", "bufsize", "softspace",
205 # "closed" is a property, see below
206 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000207
Guido van Rossume9f66142002-08-07 15:46:19 +0000208 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000209 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000210 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000211 if bufsize < 0:
212 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000213 self.bufsize = bufsize
214 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000215 if bufsize == 0:
216 self._rbufsize = 1
217 elif bufsize == 1:
218 self._rbufsize = self.default_bufsize
219 else:
220 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000221 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000222 self._rbuf = "" # A string
223 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000224
Guido van Rossumc18993f2002-08-08 15:16:20 +0000225 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000226 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000227 closed = property(_getclosed, doc="True if the file is closed")
228
Fred Drakea6070f02000-08-16 14:14:32 +0000229 def close(self):
230 try:
231 if self._sock:
232 self.flush()
233 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000234 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000235
236 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000237 try:
238 self.close()
239 except:
240 # close() may fail if __init__ didn't complete
241 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000242
243 def flush(self):
244 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000245 buffer = "".join(self._wbuf)
246 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000247 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000248
Neal Norwitz2b342902002-06-13 22:18:39 +0000249 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000250 return self._sock.fileno()
251
252 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000253 data = str(data) # XXX Should really reject non-string non-buffers
254 if not data:
255 return
256 self._wbuf.append(data)
257 if (self._wbufsize == 0 or
258 self._wbufsize == 1 and '\n' in data or
259 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000260 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000261
262 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000263 # XXX We could do better here for very long lists
264 # XXX Should really reject non-string non-buffers
265 self._wbuf.extend(filter(None, map(str, list)))
266 if (self._wbufsize <= 1 or
267 self._get_wbuf_len() >= self._wbufsize):
268 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000269
Guido van Rossum443fec32002-08-08 01:02:16 +0000270 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000271 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000272 for x in self._wbuf:
273 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000274 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000275
Guido van Rossum67f7a382002-06-06 21:08:16 +0000276 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000277 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000278 if size < 0:
279 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000280 buffers = []
281 if data:
282 buffers.append(data)
283 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000284 if self._rbufsize <= 1:
285 recv_size = self.default_bufsize
286 else:
287 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000288 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000289 data = self._sock.recv(recv_size)
290 if not data:
291 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000292 buffers.append(data)
293 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000294 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000295 # Read until size bytes or EOF seen, whichever comes first
296 buf_len = len(data)
297 if buf_len >= size:
298 self._rbuf = data[size:]
299 return data[:size]
300 buffers = []
301 if data:
302 buffers.append(data)
303 self._rbuf = ""
304 while True:
305 left = size - buf_len
306 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000307 data = self._sock.recv(recv_size)
308 if not data:
309 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000310 buffers.append(data)
311 n = len(data)
312 if n >= left:
313 self._rbuf = data[left:]
314 buffers[-1] = data[:left]
315 break
316 buf_len += n
317 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000318
Guido van Rossum67f7a382002-06-06 21:08:16 +0000319 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000320 data = self._rbuf
321 if size < 0:
322 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000323 if self._rbufsize <= 1:
324 # Speed up unbuffered case
325 assert data == ""
326 buffers = []
327 recv = self._sock.recv
328 while data != "\n":
329 data = recv(1)
330 if not data:
331 break
332 buffers.append(data)
333 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000334 nl = data.find('\n')
335 if nl >= 0:
336 nl += 1
337 self._rbuf = data[nl:]
338 return data[:nl]
339 buffers = []
340 if data:
341 buffers.append(data)
342 self._rbuf = ""
343 while True:
344 data = self._sock.recv(self._rbufsize)
345 if not data:
346 break
347 buffers.append(data)
348 nl = data.find('\n')
349 if nl >= 0:
350 nl += 1
351 self._rbuf = data[nl:]
352 buffers[-1] = data[:nl]
353 break
354 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000355 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000356 # Read until size bytes or \n or EOF seen, whichever comes first
357 nl = data.find('\n', 0, size)
358 if nl >= 0:
359 nl += 1
360 self._rbuf = data[nl:]
361 return data[:nl]
362 buf_len = len(data)
363 if buf_len >= size:
364 self._rbuf = data[size:]
365 return data[:size]
366 buffers = []
367 if data:
368 buffers.append(data)
369 self._rbuf = ""
370 while True:
371 data = self._sock.recv(self._rbufsize)
372 if not data:
373 break
374 buffers.append(data)
375 left = size - buf_len
376 nl = data.find('\n', 0, left)
377 if nl >= 0:
378 nl += 1
379 self._rbuf = data[nl:]
380 buffers[-1] = data[:nl]
381 break
382 n = len(data)
383 if n >= left:
384 self._rbuf = data[left:]
385 buffers[-1] = data[:left]
386 break
387 buf_len += n
388 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000389
390 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000391 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000392 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000393 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000394 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000395 if not line:
396 break
Fred Drakea6070f02000-08-16 14:14:32 +0000397 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000398 total += len(line)
399 if sizehint and total >= sizehint:
400 break
Fred Drakea6070f02000-08-16 14:14:32 +0000401 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000402
403 # Iterator protocols
404
405 def __iter__(self):
406 return self
407
408 def next(self):
409 line = self.readline()
410 if not line:
411 raise StopIteration
412 return line