blob: cd1540c3b41604e5f2a22d344fed4450801c8740 [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:
48 from _ssl import *
Guido van Rossumc18993f2002-08-08 15:16:20 +000049 _have_ssl = True
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000050except ImportError:
Guido van Rossumc18993f2002-08-08 15:16:20 +000051 pass
Fred Drakea6070f02000-08-16 14:14:32 +000052
53import os, sys
54
Skip Montanaro0de65802001-02-15 22:15:14 +000055__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000056__all__.extend(os._get_exports_list(_socket))
Tim Peters18e67782002-02-17 04:25:24 +000057# XXX shouldn't there be something similar to the above for _ssl exports?
Skip Montanaro0de65802001-02-15 22:15:14 +000058
Guido van Rossumc18993f2002-08-08 15:16:20 +000059_realsocket = socket
60_needwrapper = False
Fred Drakea6070f02000-08-16 14:14:32 +000061if (sys.platform.lower().startswith("win")
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000062 or (hasattr(os, 'uname') and os.uname()[0] == "BeOS")
Tim Peters18e67782002-02-17 04:25:24 +000063 or sys.platform=="riscos"):
Fred Drakea6070f02000-08-16 14:14:32 +000064
Guido van Rossumc18993f2002-08-08 15:16:20 +000065 _needwrapper = True
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")
Fred Drakea6070f02000-08-16 14:14:32 +000093del os, sys
94
95
96def getfqdn(name=''):
97 """Get fully qualified domain name from name.
98
99 An empty argument is interpreted as meaning the local host.
100
101 First the hostname returned by gethostbyaddr() is checked, then
102 possibly existing aliases. In case no FQDN is available, hostname
103 is returned.
104 """
105 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000106 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000107 name = gethostname()
108 try:
109 hostname, aliases, ipaddrs = gethostbyaddr(name)
110 except error:
111 pass
112 else:
113 aliases.insert(0, hostname)
114 for name in aliases:
115 if '.' in name:
116 break
117 else:
118 name = hostname
119 return name
120
121
122#
123# These classes are used by the socket() defined on Windows and BeOS
124# platforms to provide a best-effort implementation of the cleanup
125# semantics needed when sockets can't be dup()ed.
126#
127# These are not actually used on other platforms.
128#
129
Guido van Rossume5e50592001-08-18 01:23:20 +0000130_socketmethods = (
131 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
132 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000133 'recv', 'recvfrom', 'send', 'sendall', 'sendto', 'setblocking',
134 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000135
Guido van Rossumc18993f2002-08-08 15:16:20 +0000136class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000137
Guido van Rossumc18993f2002-08-08 15:16:20 +0000138 __doc__ = _realsocket.__doc__
139
140 __slots__ = ["_sock"]
141
142 class _closedsocket(object):
143 __slots__ = []
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000144 def __getattr__(self, name):
145 raise error(9, 'Bad file descriptor')
146
Guido van Rossumc18993f2002-08-08 15:16:20 +0000147 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
148 if _sock is None:
149 _sock = _realsocket(family, type, proto)
150 self._sock = _sock
Fred Drakea6070f02000-08-16 14:14:32 +0000151
152 def close(self):
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000153 # Avoid referencing globals here
154 self._sock = self.__class__._closedsocket()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000155 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000156
157 def __del__(self):
158 self.close()
159
160 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
Guido van Rossumc18993f2002-08-08 15:16:20 +0000178 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
179 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000180 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000181 exec _s % (_m, _m, _m, _m)
Fred Drakea6070f02000-08-16 14:14:32 +0000182
Guido van Rossumc18993f2002-08-08 15:16:20 +0000183if _needwrapper:
184 socket = _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 Rossumc18993f2002-08-08 15:16:20 +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 Rossum443fec32002-08-08 01:02:16 +0000210 # The buffers are lists of non-empty strings
211 self._rbuf = []
212 self._wbuf = []
Fred Drakea6070f02000-08-16 14:14:32 +0000213
Guido van Rossumc18993f2002-08-08 15:16:20 +0000214 def _getclosed(self):
215 return self._sock is not None
216 closed = property(_getclosed, doc="True if the file is closed")
217
Fred Drakea6070f02000-08-16 14:14:32 +0000218 def close(self):
219 try:
220 if self._sock:
221 self.flush()
222 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000223 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000224
225 def __del__(self):
226 self.close()
227
228 def flush(self):
229 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000230 buffer = "".join(self._wbuf)
231 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000232 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000233
Neal Norwitz2b342902002-06-13 22:18:39 +0000234 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000235 return self._sock.fileno()
236
237 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000238 data = str(data) # XXX Should really reject non-string non-buffers
239 if not data:
240 return
241 self._wbuf.append(data)
242 if (self._wbufsize == 0 or
243 self._wbufsize == 1 and '\n' in data or
244 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000245 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000246
247 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000248 # XXX We could do better here for very long lists
249 # XXX Should really reject non-string non-buffers
250 self._wbuf.extend(filter(None, map(str, list)))
251 if (self._wbufsize <= 1 or
252 self._get_wbuf_len() >= self._wbufsize):
253 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000254
Guido van Rossum443fec32002-08-08 01:02:16 +0000255 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000256 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000257 for x in self._wbuf:
258 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000259 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000260
Guido van Rossum443fec32002-08-08 01:02:16 +0000261 def _get_rbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000262 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000263 for x in self._rbuf:
264 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000265 return buf_len
266
267 def read(self, size=-1):
Guido van Rossum443fec32002-08-08 01:02:16 +0000268 if size < 0:
269 # Read until EOF
270 if self._rbufsize <= 1:
271 recv_size = self.default_bufsize
272 else:
273 recv_size = self._rbufsize
274 while 1:
275 data = self._sock.recv(recv_size)
276 if not data:
277 break
278 self._rbuf.append(data)
279 else:
280 buf_len = self._get_rbuf_len()
281 while buf_len < size:
282 recv_size = max(self._rbufsize, size - buf_len)
283 data = self._sock.recv(recv_size)
284 if not data:
285 break
286 buf_len += len(data)
287 self._rbuf.append(data)
288 data = "".join(self._rbuf)
289 self._rbuf = []
290 if 0 <= size < buf_len:
Neal Norwitz2b342902002-06-13 22:18:39 +0000291 self._rbuf.append(data[size:])
292 data = data[:size]
Fred Drakea6070f02000-08-16 14:14:32 +0000293 return data
294
Guido van Rossum67f7a382002-06-06 21:08:16 +0000295 def readline(self, size=-1):
Guido van Rossum443fec32002-08-08 01:02:16 +0000296 data_len = 0
297 for index, x in enumerate(self._rbuf):
298 data_len += len(x)
299 if '\n' in x or 0 <= size <= data_len:
300 index += 1
301 data = "".join(self._rbuf[:index])
302 end = data.find('\n')
303 if end < 0:
304 end = len(data)
305 else:
306 end += 1
307 if 0 <= size < end:
308 end = size
309 data, rest = data[:end], data[end:]
310 if rest:
311 self._rbuf[:index] = [rest]
312 else:
313 del self._rbuf[:index]
314 return data
315 recv_size = self._rbufsize
316 while 1:
317 if size >= 0:
318 recv_size = min(self._rbufsize, size - data_len)
319 x = self._sock.recv(recv_size)
320 if not x:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000321 break
Guido van Rossum443fec32002-08-08 01:02:16 +0000322 data_len += len(x)
323 self._rbuf.append(x)
324 if '\n' in x or 0 <= size <= data_len:
325 break
326 data = "".join(self._rbuf)
327 end = data.find('\n')
328 if end < 0:
329 end = len(data)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000330 else:
Guido van Rossum443fec32002-08-08 01:02:16 +0000331 end += 1
332 if 0 <= size < end:
333 end = size
334 data, rest = data[:end], data[end:]
335 if rest:
336 self._rbuf = [rest]
337 else:
338 self._rbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000339 return data
340
341 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000342 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000343 list = []
344 while 1:
345 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000346 if not line:
347 break
Fred Drakea6070f02000-08-16 14:14:32 +0000348 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000349 total += len(line)
350 if sizehint and total >= sizehint:
351 break
Fred Drakea6070f02000-08-16 14:14:32 +0000352 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000353
354 # Iterator protocols
355
356 def __iter__(self):
357 return self
358
359 def next(self):
360 line = self.readline()
361 if not line:
362 raise StopIteration
363 return line