blob: 8e30ce0a34a20e3d025941ce283c73de8828ae65 [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
Skip Montanaroc6899182003-04-29 19:27:26 +0000150 __slots__ = ["_sock", "send", "recv", "sendto", "recvfrom"]
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
Skip Montanaroc6899182003-04-29 19:27:26 +0000156 self.send = self._sock.send
157 self.recv = self._sock.recv
158 self.sendto = self._sock.sendto
159 self.recvfrom = self._sock.recvfrom
Fred Drakea6070f02000-08-16 14:14:32 +0000160
161 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000162 self._sock = _closedsocket()
Skip Montanaroc6899182003-04-29 19:27:26 +0000163 self.send = self.recv = self.sendto = self.recvfrom = self._sock._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)
183
Guido van Rossumc18993f2002-08-08 15:16:20 +0000184 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
185 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000186 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000187 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000188 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000189
Skip Montanaro89feabc2003-03-30 04:54:24 +0000190socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000191
Guido van Rossumc18993f2002-08-08 15:16:20 +0000192class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000193 """Faux file object attached to a socket object."""
194
195 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000196 name = "<socket>"
197
198 __slots__ = ["mode", "bufsize", "softspace",
199 # "closed" is a property, see below
200 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000201
Guido van Rossume9f66142002-08-07 15:46:19 +0000202 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000203 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000204 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000205 if bufsize < 0:
206 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000207 self.bufsize = bufsize
208 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000209 if bufsize == 0:
210 self._rbufsize = 1
211 elif bufsize == 1:
212 self._rbufsize = self.default_bufsize
213 else:
214 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000215 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000216 self._rbuf = "" # A string
217 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000218
Guido van Rossumc18993f2002-08-08 15:16:20 +0000219 def _getclosed(self):
220 return self._sock is not None
221 closed = property(_getclosed, doc="True if the file is closed")
222
Fred Drakea6070f02000-08-16 14:14:32 +0000223 def close(self):
224 try:
225 if self._sock:
226 self.flush()
227 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000228 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000229
230 def __del__(self):
Guido van Rossum65f8ced2003-05-29 14:36:57 +0000231 try:
232 self.close()
233 except:
234 # close() may fail if __init__ didn't complete
235 pass
Fred Drakea6070f02000-08-16 14:14:32 +0000236
237 def flush(self):
238 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000239 buffer = "".join(self._wbuf)
240 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000241 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000242
Neal Norwitz2b342902002-06-13 22:18:39 +0000243 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000244 return self._sock.fileno()
245
246 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000247 data = str(data) # XXX Should really reject non-string non-buffers
248 if not data:
249 return
250 self._wbuf.append(data)
251 if (self._wbufsize == 0 or
252 self._wbufsize == 1 and '\n' in data or
253 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000254 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000255
256 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000257 # XXX We could do better here for very long lists
258 # XXX Should really reject non-string non-buffers
259 self._wbuf.extend(filter(None, map(str, list)))
260 if (self._wbufsize <= 1 or
261 self._get_wbuf_len() >= self._wbufsize):
262 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000263
Guido van Rossum443fec32002-08-08 01:02:16 +0000264 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000265 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000266 for x in self._wbuf:
267 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000268 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000269
Guido van Rossum67f7a382002-06-06 21:08:16 +0000270 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000271 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000272 if size < 0:
273 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000274 buffers = []
275 if data:
276 buffers.append(data)
277 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000278 if self._rbufsize <= 1:
279 recv_size = self.default_bufsize
280 else:
281 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000282 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000283 data = self._sock.recv(recv_size)
284 if not data:
285 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000286 buffers.append(data)
287 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000288 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000289 # Read until size bytes or EOF seen, whichever comes first
290 buf_len = len(data)
291 if buf_len >= size:
292 self._rbuf = data[size:]
293 return data[:size]
294 buffers = []
295 if data:
296 buffers.append(data)
297 self._rbuf = ""
298 while True:
299 left = size - buf_len
300 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000301 data = self._sock.recv(recv_size)
302 if not data:
303 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000304 buffers.append(data)
305 n = len(data)
306 if n >= left:
307 self._rbuf = data[left:]
308 buffers[-1] = data[:left]
309 break
310 buf_len += n
311 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000312
Guido van Rossum67f7a382002-06-06 21:08:16 +0000313 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000314 data = self._rbuf
315 if size < 0:
316 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000317 if self._rbufsize <= 1:
318 # Speed up unbuffered case
319 assert data == ""
320 buffers = []
321 recv = self._sock.recv
322 while data != "\n":
323 data = recv(1)
324 if not data:
325 break
326 buffers.append(data)
327 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000328 nl = data.find('\n')
329 if nl >= 0:
330 nl += 1
331 self._rbuf = data[nl:]
332 return data[:nl]
333 buffers = []
334 if data:
335 buffers.append(data)
336 self._rbuf = ""
337 while True:
338 data = self._sock.recv(self._rbufsize)
339 if not data:
340 break
341 buffers.append(data)
342 nl = data.find('\n')
343 if nl >= 0:
344 nl += 1
345 self._rbuf = data[nl:]
346 buffers[-1] = data[:nl]
347 break
348 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000349 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000350 # Read until size bytes or \n or EOF seen, whichever comes first
351 nl = data.find('\n', 0, size)
352 if nl >= 0:
353 nl += 1
354 self._rbuf = data[nl:]
355 return data[:nl]
356 buf_len = len(data)
357 if buf_len >= size:
358 self._rbuf = data[size:]
359 return data[:size]
360 buffers = []
361 if data:
362 buffers.append(data)
363 self._rbuf = ""
364 while True:
365 data = self._sock.recv(self._rbufsize)
366 if not data:
367 break
368 buffers.append(data)
369 left = size - buf_len
370 nl = data.find('\n', 0, left)
371 if nl >= 0:
372 nl += 1
373 self._rbuf = data[nl:]
374 buffers[-1] = data[:nl]
375 break
376 n = len(data)
377 if n >= left:
378 self._rbuf = data[left:]
379 buffers[-1] = data[:left]
380 break
381 buf_len += n
382 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000383
384 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000385 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000386 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000387 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000388 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000389 if not line:
390 break
Fred Drakea6070f02000-08-16 14:14:32 +0000391 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000392 total += len(line)
393 if sizehint and total >= sizehint:
394 break
Fred Drakea6070f02000-08-16 14:14:32 +0000395 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000396
397 # Iterator protocols
398
399 def __iter__(self):
400 return self
401
402 def next(self):
403 line = self.readline()
404 if not line:
405 raise StopIteration
406 return line