blob: 32a92b4535452570a0218127cefc6fe91932c534 [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
Guido van Rossum715f9702002-08-08 18:11:36 +0000133class _closedsocket(object):
134 __slots__ = []
Skip Montanaroc6899182003-04-29 19:27:26 +0000135 def _dummy(*args):
Fred Drake70d566b2003-04-29 19:50:25 +0000136 raise error(EBADF, 'Bad file descriptor')
Skip Montanaroc6899182003-04-29 19:27:26 +0000137 send = recv = sendto = recvfrom = __getattr__ = _dummy
Guido van Rossum715f9702002-08-08 18:11:36 +0000138
Guido van Rossumc18993f2002-08-08 15:16:20 +0000139class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000140
Guido van Rossumc18993f2002-08-08 15:16:20 +0000141 __doc__ = _realsocket.__doc__
142
Raymond Hettinger027bb632004-05-31 03:09:25 +0000143 __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom",
144 "__weakref__"]
Guido van Rossumc18993f2002-08-08 15:16:20 +0000145
Guido van Rossumc18993f2002-08-08 15:16:20 +0000146 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
147 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000148 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000149 self._sock = _sock
Skip Montanaroc6899182003-04-29 19:27:26 +0000150 self.send = self._sock.send
151 self.recv = self._sock.recv
152 self.sendto = self._sock.sendto
153 self.recvfrom = self._sock.recvfrom
Fred Drakea6070f02000-08-16 14:14:32 +0000154
155 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000156 self._sock = _closedsocket()
Skip Montanaroc6899182003-04-29 19:27:26 +0000157 self.send = self.recv = self.sendto = self.recvfrom = self._sock._dummy
Guido van Rossumc18993f2002-08-08 15:16:20 +0000158 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000159
Fred Drakea6070f02000-08-16 14:14:32 +0000160 def accept(self):
161 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000162 return _socketobject(_sock=sock), addr
163 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000164
165 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000166 """dup() -> socket object
167
168 Return a new socket object connected to the same system resource."""
169 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000170
171 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000172 """makefile([mode[, bufsize]]) -> file object
173
174 Return a regular file object corresponding to the socket. The mode
175 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000176 return _fileobject(self._sock, mode, bufsize)
177
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000178 family = property(lambda self: self._sock.family, doc="the socket family")
179 type = property(lambda self: self._sock.type, doc="the socket type")
180 proto = property(lambda self: self._sock.proto, doc="the socket protocol")
181
Guido van Rossumc18993f2002-08-08 15:16:20 +0000182 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
183 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000184 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000185 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000186 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000187
Skip Montanaro89feabc2003-03-30 04:54:24 +0000188socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000189
Guido van Rossumc18993f2002-08-08 15:16:20 +0000190class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000191 """Faux file object attached to a socket object."""
192
193 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000194 name = "<socket>"
195
196 __slots__ = ["mode", "bufsize", "softspace",
197 # "closed" is a property, see below
198 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000199
Guido van Rossume9f66142002-08-07 15:46:19 +0000200 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000201 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000202 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000203 if bufsize < 0:
204 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000205 self.bufsize = bufsize
206 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000207 if bufsize == 0:
208 self._rbufsize = 1
209 elif bufsize == 1:
210 self._rbufsize = self.default_bufsize
211 else:
212 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000213 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000214 self._rbuf = "" # A string
215 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000216
Guido van Rossumc18993f2002-08-08 15:16:20 +0000217 def _getclosed(self):
Tim Peters116d83c2004-03-28 02:20:45 +0000218 return self._sock is None
Guido van Rossumc18993f2002-08-08 15:16:20 +0000219 closed = property(_getclosed, doc="True if the file is closed")
220
Fred Drakea6070f02000-08-16 14:14:32 +0000221 def close(self):
222 try:
223 if self._sock:
224 self.flush()
225 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000226 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000227
228 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000229 try:
230 self.close()
231 except:
232 # close() may fail if __init__ didn't complete
233 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000234
235 def flush(self):
236 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000237 buffer = "".join(self._wbuf)
238 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000239 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000240
Neal Norwitz2b342902002-06-13 22:18:39 +0000241 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000242 return self._sock.fileno()
243
244 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000245 data = str(data) # XXX Should really reject non-string non-buffers
246 if not data:
247 return
248 self._wbuf.append(data)
249 if (self._wbufsize == 0 or
250 self._wbufsize == 1 and '\n' in data or
251 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000252 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000253
254 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000255 # XXX We could do better here for very long lists
256 # XXX Should really reject non-string non-buffers
257 self._wbuf.extend(filter(None, map(str, list)))
258 if (self._wbufsize <= 1 or
259 self._get_wbuf_len() >= self._wbufsize):
260 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000261
Guido van Rossum443fec32002-08-08 01:02:16 +0000262 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000263 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000264 for x in self._wbuf:
265 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000266 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000267
Guido van Rossum67f7a382002-06-06 21:08:16 +0000268 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000269 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000270 if size < 0:
271 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000272 buffers = []
273 if data:
274 buffers.append(data)
275 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000276 if self._rbufsize <= 1:
277 recv_size = self.default_bufsize
278 else:
279 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000280 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000281 data = self._sock.recv(recv_size)
282 if not data:
283 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000284 buffers.append(data)
285 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000286 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000287 # Read until size bytes or EOF seen, whichever comes first
288 buf_len = len(data)
289 if buf_len >= size:
290 self._rbuf = data[size:]
291 return data[:size]
292 buffers = []
293 if data:
294 buffers.append(data)
295 self._rbuf = ""
296 while True:
297 left = size - buf_len
298 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000299 data = self._sock.recv(recv_size)
300 if not data:
301 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000302 buffers.append(data)
303 n = len(data)
304 if n >= left:
305 self._rbuf = data[left:]
306 buffers[-1] = data[:left]
307 break
308 buf_len += n
309 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000310
Guido van Rossum67f7a382002-06-06 21:08:16 +0000311 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000312 data = self._rbuf
313 if size < 0:
314 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000315 if self._rbufsize <= 1:
316 # Speed up unbuffered case
317 assert data == ""
318 buffers = []
319 recv = self._sock.recv
320 while data != "\n":
321 data = recv(1)
322 if not data:
323 break
324 buffers.append(data)
325 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000326 nl = data.find('\n')
327 if nl >= 0:
328 nl += 1
329 self._rbuf = data[nl:]
330 return data[:nl]
331 buffers = []
332 if data:
333 buffers.append(data)
334 self._rbuf = ""
335 while True:
336 data = self._sock.recv(self._rbufsize)
337 if not data:
338 break
339 buffers.append(data)
340 nl = data.find('\n')
341 if nl >= 0:
342 nl += 1
343 self._rbuf = data[nl:]
344 buffers[-1] = data[:nl]
345 break
346 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000347 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000348 # Read until size bytes or \n or EOF seen, whichever comes first
349 nl = data.find('\n', 0, size)
350 if nl >= 0:
351 nl += 1
352 self._rbuf = data[nl:]
353 return data[:nl]
354 buf_len = len(data)
355 if buf_len >= size:
356 self._rbuf = data[size:]
357 return data[:size]
358 buffers = []
359 if data:
360 buffers.append(data)
361 self._rbuf = ""
362 while True:
363 data = self._sock.recv(self._rbufsize)
364 if not data:
365 break
366 buffers.append(data)
367 left = size - buf_len
368 nl = data.find('\n', 0, left)
369 if nl >= 0:
370 nl += 1
371 self._rbuf = data[nl:]
372 buffers[-1] = data[:nl]
373 break
374 n = len(data)
375 if n >= left:
376 self._rbuf = data[left:]
377 buffers[-1] = data[:left]
378 break
379 buf_len += n
380 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000381
382 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000383 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000384 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000385 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000386 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000387 if not line:
388 break
Fred Drakea6070f02000-08-16 14:14:32 +0000389 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000390 total += len(line)
391 if sizehint and total >= sizehint:
392 break
Fred Drakea6070f02000-08-16 14:14:32 +0000393 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000394
395 # Iterator protocols
396
397 def __iter__(self):
398 return self
399
400 def next(self):
401 line = self.readline()
402 if not line:
403 raise StopIteration
404 return line