blob: 12f3c052d2955245b4e00ea9c7958a944649934f [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
Skip Montanaro0de65802001-02-15 22:15:14 +000057__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000058__all__.extend(os._get_exports_list(_socket))
Guido van Rossumde7cade2002-08-08 15:25:28 +000059if _have_ssl:
60 __all__.extend(os._get_exports_list(_ssl))
Skip Montanaro0de65802001-02-15 22:15:14 +000061
Guido van Rossumc18993f2002-08-08 15:16:20 +000062_realsocket = socket
Fred Drakea6070f02000-08-16 14:14:32 +000063if (sys.platform.lower().startswith("win")
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000064 or (hasattr(os, 'uname') and os.uname()[0] == "BeOS")
Tim Peters18e67782002-02-17 04:25:24 +000065 or sys.platform=="riscos"):
Fred Drakea6070f02000-08-16 14:14:32 +000066
Guido van Rossumc18993f2002-08-08 15:16:20 +000067 if _have_ssl:
68 _realssl = ssl
Guido van Rossum3f69f212001-03-22 22:12:17 +000069 def ssl(sock, keyfile=None, certfile=None):
70 if hasattr(sock, "_sock"):
71 sock = sock._sock
Guido van Rossumc18993f2002-08-08 15:16:20 +000072 return _realssl(sock, keyfile, certfile)
Fred Drakea6070f02000-08-16 14:14:32 +000073
74# WSA error codes
75if sys.platform.lower().startswith("win"):
76 errorTab = {}
77 errorTab[10004] = "The operation was interrupted."
78 errorTab[10009] = "A bad file handle was passed."
79 errorTab[10013] = "Permission denied."
80 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
81 errorTab[10022] = "An invalid operation was attempted."
82 errorTab[10035] = "The socket operation would block"
83 errorTab[10036] = "A blocking operation is already in progress."
84 errorTab[10048] = "The network address is in use."
85 errorTab[10054] = "The connection has been reset."
86 errorTab[10058] = "The network has been shut down."
87 errorTab[10060] = "The operation timed out."
88 errorTab[10061] = "Connection refused."
89 errorTab[10063] = "The name is too long."
90 errorTab[10064] = "The host is down."
91 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000092 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000093
Fred Drakea6070f02000-08-16 14:14:32 +000094del os, sys
95
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',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000134 'recv', 'recvfrom', 'send', 'sendall', 'sendto', 'setblocking',
135 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000136
Guido van Rossum715f9702002-08-08 18:11:36 +0000137class _closedsocket(object):
138 __slots__ = []
139 def __getattr__(self, name):
140 raise error(9, 'Bad file descriptor')
141
Guido van Rossumc18993f2002-08-08 15:16:20 +0000142class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000143
Guido van Rossumc18993f2002-08-08 15:16:20 +0000144 __doc__ = _realsocket.__doc__
145
146 __slots__ = ["_sock"]
147
Guido van Rossumc18993f2002-08-08 15:16:20 +0000148 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
149 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000150 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000151 self._sock = _sock
Fred Drakea6070f02000-08-16 14:14:32 +0000152
153 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000154 self._sock = _closedsocket()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000155 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000156
Fred Drakea6070f02000-08-16 14:14:32 +0000157 def accept(self):
158 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000159 return _socketobject(_sock=sock), addr
160 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000161
162 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000163 """dup() -> socket object
164
165 Return a new socket object connected to the same system resource."""
166 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000167
168 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000169 """makefile([mode[, bufsize]]) -> file object
170
171 Return a regular file object corresponding to the socket. The mode
172 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000173 return _fileobject(self._sock, mode, bufsize)
174
Guido van Rossumc18993f2002-08-08 15:16:20 +0000175 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
176 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000177 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000178 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000179 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000180
Skip Montanaro89feabc2003-03-30 04:54:24 +0000181socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000182
Guido van Rossumc18993f2002-08-08 15:16:20 +0000183class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000184 """Faux file object attached to a socket object."""
185
186 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000187 name = "<socket>"
188
189 __slots__ = ["mode", "bufsize", "softspace",
190 # "closed" is a property, see below
191 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000192
Guido van Rossume9f66142002-08-07 15:46:19 +0000193 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000194 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000195 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000196 if bufsize < 0:
197 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000198 self.bufsize = bufsize
199 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000200 if bufsize == 0:
201 self._rbufsize = 1
202 elif bufsize == 1:
203 self._rbufsize = self.default_bufsize
204 else:
205 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000206 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000207 self._rbuf = "" # A string
208 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000209
Guido van Rossumc18993f2002-08-08 15:16:20 +0000210 def _getclosed(self):
211 return self._sock is not None
212 closed = property(_getclosed, doc="True if the file is closed")
213
Fred Drakea6070f02000-08-16 14:14:32 +0000214 def close(self):
215 try:
216 if self._sock:
217 self.flush()
218 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000219 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000220
221 def __del__(self):
222 self.close()
223
224 def flush(self):
225 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000226 buffer = "".join(self._wbuf)
227 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000228 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000229
Neal Norwitz2b342902002-06-13 22:18:39 +0000230 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000231 return self._sock.fileno()
232
233 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000234 data = str(data) # XXX Should really reject non-string non-buffers
235 if not data:
236 return
237 self._wbuf.append(data)
238 if (self._wbufsize == 0 or
239 self._wbufsize == 1 and '\n' in data or
240 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000241 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000242
243 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000244 # XXX We could do better here for very long lists
245 # XXX Should really reject non-string non-buffers
246 self._wbuf.extend(filter(None, map(str, list)))
247 if (self._wbufsize <= 1 or
248 self._get_wbuf_len() >= self._wbufsize):
249 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000250
Guido van Rossum443fec32002-08-08 01:02:16 +0000251 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000252 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000253 for x in self._wbuf:
254 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000255 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000256
Guido van Rossum67f7a382002-06-06 21:08:16 +0000257 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000258 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000259 if size < 0:
260 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000261 buffers = []
262 if data:
263 buffers.append(data)
264 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000265 if self._rbufsize <= 1:
266 recv_size = self.default_bufsize
267 else:
268 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000269 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000270 data = self._sock.recv(recv_size)
271 if not data:
272 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000273 buffers.append(data)
274 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000275 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000276 # Read until size bytes or EOF seen, whichever comes first
277 buf_len = len(data)
278 if buf_len >= size:
279 self._rbuf = data[size:]
280 return data[:size]
281 buffers = []
282 if data:
283 buffers.append(data)
284 self._rbuf = ""
285 while True:
286 left = size - buf_len
287 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000288 data = self._sock.recv(recv_size)
289 if not data:
290 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000291 buffers.append(data)
292 n = len(data)
293 if n >= left:
294 self._rbuf = data[left:]
295 buffers[-1] = data[:left]
296 break
297 buf_len += n
298 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000299
Guido van Rossum67f7a382002-06-06 21:08:16 +0000300 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000301 data = self._rbuf
302 if size < 0:
303 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000304 if self._rbufsize <= 1:
305 # Speed up unbuffered case
306 assert data == ""
307 buffers = []
308 recv = self._sock.recv
309 while data != "\n":
310 data = recv(1)
311 if not data:
312 break
313 buffers.append(data)
314 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000315 nl = data.find('\n')
316 if nl >= 0:
317 nl += 1
318 self._rbuf = data[nl:]
319 return data[:nl]
320 buffers = []
321 if data:
322 buffers.append(data)
323 self._rbuf = ""
324 while True:
325 data = self._sock.recv(self._rbufsize)
326 if not data:
327 break
328 buffers.append(data)
329 nl = data.find('\n')
330 if nl >= 0:
331 nl += 1
332 self._rbuf = data[nl:]
333 buffers[-1] = data[:nl]
334 break
335 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000336 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000337 # Read until size bytes or \n or EOF seen, whichever comes first
338 nl = data.find('\n', 0, size)
339 if nl >= 0:
340 nl += 1
341 self._rbuf = data[nl:]
342 return data[:nl]
343 buf_len = len(data)
344 if buf_len >= size:
345 self._rbuf = data[size:]
346 return data[:size]
347 buffers = []
348 if data:
349 buffers.append(data)
350 self._rbuf = ""
351 while True:
352 data = self._sock.recv(self._rbufsize)
353 if not data:
354 break
355 buffers.append(data)
356 left = size - buf_len
357 nl = data.find('\n', 0, left)
358 if nl >= 0:
359 nl += 1
360 self._rbuf = data[nl:]
361 buffers[-1] = data[:nl]
362 break
363 n = len(data)
364 if n >= left:
365 self._rbuf = data[left:]
366 buffers[-1] = data[:left]
367 break
368 buf_len += n
369 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000370
371 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000372 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000373 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000374 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000375 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000376 if not line:
377 break
Fred Drakea6070f02000-08-16 14:14:32 +0000378 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000379 total += len(line)
380 if sizehint and total >= sizehint:
381 break
Fred Drakea6070f02000-08-16 14:14:32 +0000382 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000383
384 # Iterator protocols
385
386 def __iter__(self):
387 return self
388
389 def next(self):
390 line = self.readline()
391 if not line:
392 raise StopIteration
393 return line