blob: a8a4e39d5a18f464aedba1e91557bf82b7a5fbae [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
33
34Integer constants:
35
36AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
37SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
38
39Many other constants may be defined; these may be used in calls to
40the setsockopt() and getsockopt() methods.
41"""
42
Tim Peters18e67782002-02-17 04:25:24 +000043import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000044from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000045
Guido van Rossumc18993f2002-08-08 15:16:20 +000046_have_ssl = False
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000047try:
Guido van Rossumde7cade2002-08-08 15:25:28 +000048 import _ssl
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000049 from _ssl import *
Guido van Rossumc18993f2002-08-08 15:16:20 +000050 _have_ssl = True
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000051except ImportError:
Guido van Rossumc18993f2002-08-08 15:16:20 +000052 pass
Fred Drakea6070f02000-08-16 14:14:32 +000053
54import os, sys
55
Skip Montanaro0de65802001-02-15 22:15:14 +000056__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000057__all__.extend(os._get_exports_list(_socket))
Guido van Rossumde7cade2002-08-08 15:25:28 +000058if _have_ssl:
59 __all__.extend(os._get_exports_list(_ssl))
Skip Montanaro0de65802001-02-15 22:15:14 +000060
Guido van Rossumc18993f2002-08-08 15:16:20 +000061_realsocket = socket
62_needwrapper = False
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 _needwrapper = True
Fred Drakea6070f02000-08-16 14:14:32 +000068
Guido van Rossumc18993f2002-08-08 15:16:20 +000069 if _have_ssl:
70 _realssl = ssl
Guido van Rossum3f69f212001-03-22 22:12:17 +000071 def ssl(sock, keyfile=None, certfile=None):
72 if hasattr(sock, "_sock"):
73 sock = sock._sock
Guido van Rossumc18993f2002-08-08 15:16:20 +000074 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 +000096del os, sys
97
98
99def getfqdn(name=''):
100 """Get fully qualified domain name from name.
101
102 An empty argument is interpreted as meaning the local host.
103
104 First the hostname returned by gethostbyaddr() is checked, then
105 possibly existing aliases. In case no FQDN is available, hostname
106 is returned.
107 """
108 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000109 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000110 name = gethostname()
111 try:
112 hostname, aliases, ipaddrs = gethostbyaddr(name)
113 except error:
114 pass
115 else:
116 aliases.insert(0, hostname)
117 for name in aliases:
118 if '.' in name:
119 break
120 else:
121 name = hostname
122 return name
123
124
125#
126# These classes are used by the socket() defined on Windows and BeOS
127# platforms to provide a best-effort implementation of the cleanup
128# semantics needed when sockets can't be dup()ed.
129#
130# These are not actually used on other platforms.
131#
132
Guido van Rossume5e50592001-08-18 01:23:20 +0000133_socketmethods = (
134 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
135 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000136 'recv', 'recvfrom', 'send', 'sendall', 'sendto', 'setblocking',
137 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000138
Guido van Rossum715f9702002-08-08 18:11:36 +0000139class _closedsocket(object):
140 __slots__ = []
141 def __getattr__(self, name):
142 raise error(9, 'Bad file descriptor')
143
Guido van Rossumc18993f2002-08-08 15:16:20 +0000144class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000145
Guido van Rossumc18993f2002-08-08 15:16:20 +0000146 __doc__ = _realsocket.__doc__
147
148 __slots__ = ["_sock"]
149
Guido van Rossumc18993f2002-08-08 15:16:20 +0000150 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
151 if _sock is None:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000152 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000153 self._sock = _sock
Fred Drakea6070f02000-08-16 14:14:32 +0000154
155 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000156 self._sock = _closedsocket()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000157 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000158
Fred Drakea6070f02000-08-16 14:14:32 +0000159 def accept(self):
160 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000161 return _socketobject(_sock=sock), addr
162 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000163
164 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000165 """dup() -> socket object
166
167 Return a new socket object connected to the same system resource."""
168 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000169
170 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000171 """makefile([mode[, bufsize]]) -> file object
172
173 Return a regular file object corresponding to the socket. The mode
174 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000175 return _fileobject(self._sock, mode, bufsize)
176
Guido van Rossumc18993f2002-08-08 15:16:20 +0000177 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
178 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000179 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000180 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000181 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000182
Guido van Rossumc18993f2002-08-08 15:16:20 +0000183if _needwrapper:
Guido van Rossumdbfb1212002-08-22 17:31:16 +0000184 socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000185
Guido van Rossumc18993f2002-08-08 15:16:20 +0000186class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000187 """Faux file object attached to a socket object."""
188
189 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000190 name = "<socket>"
191
192 __slots__ = ["mode", "bufsize", "softspace",
193 # "closed" is a property, see below
194 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000195
Guido van Rossume9f66142002-08-07 15:46:19 +0000196 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000197 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000198 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000199 if bufsize < 0:
200 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000201 self.bufsize = bufsize
202 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000203 if bufsize == 0:
204 self._rbufsize = 1
205 elif bufsize == 1:
206 self._rbufsize = self.default_bufsize
207 else:
208 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000209 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000210 self._rbuf = "" # A string
211 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000212
Guido van Rossumc18993f2002-08-08 15:16:20 +0000213 def _getclosed(self):
214 return self._sock is not None
215 closed = property(_getclosed, doc="True if the file is closed")
216
Fred Drakea6070f02000-08-16 14:14:32 +0000217 def close(self):
218 try:
219 if self._sock:
220 self.flush()
221 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000222 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000223
224 def __del__(self):
225 self.close()
226
227 def flush(self):
228 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000229 buffer = "".join(self._wbuf)
230 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000231 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000232
Neal Norwitz2b342902002-06-13 22:18:39 +0000233 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000234 return self._sock.fileno()
235
236 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000237 data = str(data) # XXX Should really reject non-string non-buffers
238 if not data:
239 return
240 self._wbuf.append(data)
241 if (self._wbufsize == 0 or
242 self._wbufsize == 1 and '\n' in data or
243 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000244 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000245
246 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000247 # XXX We could do better here for very long lists
248 # XXX Should really reject non-string non-buffers
249 self._wbuf.extend(filter(None, map(str, list)))
250 if (self._wbufsize <= 1 or
251 self._get_wbuf_len() >= self._wbufsize):
252 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000253
Guido van Rossum443fec32002-08-08 01:02:16 +0000254 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000255 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000256 for x in self._wbuf:
257 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000258 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000259
Guido van Rossum67f7a382002-06-06 21:08:16 +0000260 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000261 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000262 if size < 0:
263 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000264 buffers = []
265 if data:
266 buffers.append(data)
267 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000268 if self._rbufsize <= 1:
269 recv_size = self.default_bufsize
270 else:
271 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000272 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000273 data = self._sock.recv(recv_size)
274 if not data:
275 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000276 buffers.append(data)
277 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000278 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000279 # Read until size bytes or EOF seen, whichever comes first
280 buf_len = len(data)
281 if buf_len >= size:
282 self._rbuf = data[size:]
283 return data[:size]
284 buffers = []
285 if data:
286 buffers.append(data)
287 self._rbuf = ""
288 while True:
289 left = size - buf_len
290 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000291 data = self._sock.recv(recv_size)
292 if not data:
293 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000294 buffers.append(data)
295 n = len(data)
296 if n >= left:
297 self._rbuf = data[left:]
298 buffers[-1] = data[:left]
299 break
300 buf_len += n
301 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000302
Guido van Rossum67f7a382002-06-06 21:08:16 +0000303 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000304 data = self._rbuf
305 if size < 0:
306 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000307 if self._rbufsize <= 1:
308 # Speed up unbuffered case
309 assert data == ""
310 buffers = []
311 recv = self._sock.recv
312 while data != "\n":
313 data = recv(1)
314 if not data:
315 break
316 buffers.append(data)
317 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000318 nl = data.find('\n')
319 if nl >= 0:
320 nl += 1
321 self._rbuf = data[nl:]
322 return data[:nl]
323 buffers = []
324 if data:
325 buffers.append(data)
326 self._rbuf = ""
327 while True:
328 data = self._sock.recv(self._rbufsize)
329 if not data:
330 break
331 buffers.append(data)
332 nl = data.find('\n')
333 if nl >= 0:
334 nl += 1
335 self._rbuf = data[nl:]
336 buffers[-1] = data[:nl]
337 break
338 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000339 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000340 # Read until size bytes or \n or EOF seen, whichever comes first
341 nl = data.find('\n', 0, size)
342 if nl >= 0:
343 nl += 1
344 self._rbuf = data[nl:]
345 return data[:nl]
346 buf_len = len(data)
347 if buf_len >= size:
348 self._rbuf = data[size:]
349 return data[:size]
350 buffers = []
351 if data:
352 buffers.append(data)
353 self._rbuf = ""
354 while True:
355 data = self._sock.recv(self._rbufsize)
356 if not data:
357 break
358 buffers.append(data)
359 left = size - buf_len
360 nl = data.find('\n', 0, left)
361 if nl >= 0:
362 nl += 1
363 self._rbuf = data[nl:]
364 buffers[-1] = data[:nl]
365 break
366 n = len(data)
367 if n >= left:
368 self._rbuf = data[left:]
369 buffers[-1] = data[:left]
370 break
371 buf_len += n
372 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000373
374 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000375 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000376 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000377 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000378 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000379 if not line:
380 break
Fred Drakea6070f02000-08-16 14:14:32 +0000381 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000382 total += len(line)
383 if sizehint and total >= sizehint:
384 break
Fred Drakea6070f02000-08-16 14:14:32 +0000385 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000386
387 # Iterator protocols
388
389 def __iter__(self):
390 return self
391
392 def next(self):
393 line = self.readline()
394 if not line:
395 raise StopIteration
396 return line