blob: 6c39d76e106c0e9f2b0edb9c653fdbbee916a3c1 [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 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
143 __slots__ = ["_sock"]
144
145 class _closedsocket(object):
146 __slots__ = []
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000147 def __getattr__(self, name):
148 raise error(9, 'Bad file descriptor')
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 Rossum99d2fbb2001-12-18 22:22:25 +0000156 # Avoid referencing globals here
157 self._sock = self.__class__._closedsocket()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000158 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000159
160 def __del__(self):
161 self.close()
162
163 def accept(self):
164 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000165 return _socketobject(_sock=sock), addr
166 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000167
168 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000169 """dup() -> socket object
170
171 Return a new socket object connected to the same system resource."""
172 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000173
174 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000175 """makefile([mode[, bufsize]]) -> file object
176
177 Return a regular file object corresponding to the socket. The mode
178 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000179 return _fileobject(self._sock, mode, bufsize)
180
Guido van Rossumc18993f2002-08-08 15:16:20 +0000181 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
182 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000183 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000184 exec _s % (_m, _m, _m, _m)
Fred Drakea6070f02000-08-16 14:14:32 +0000185
Guido van Rossumc18993f2002-08-08 15:16:20 +0000186if _needwrapper:
187 socket = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000188
Guido van Rossumc18993f2002-08-08 15:16:20 +0000189class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000190 """Faux file object attached to a socket object."""
191
192 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000193 name = "<socket>"
194
195 __slots__ = ["mode", "bufsize", "softspace",
196 # "closed" is a property, see below
197 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000198
Guido van Rossume9f66142002-08-07 15:46:19 +0000199 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000200 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000201 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000202 if bufsize < 0:
203 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000204 self.bufsize = bufsize
205 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000206 if bufsize == 0:
207 self._rbufsize = 1
208 elif bufsize == 1:
209 self._rbufsize = self.default_bufsize
210 else:
211 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000212 self._wbufsize = bufsize
Guido van Rossum443fec32002-08-08 01:02:16 +0000213 # The buffers are lists of non-empty strings
214 self._rbuf = []
215 self._wbuf = []
Fred Drakea6070f02000-08-16 14:14:32 +0000216
Guido van Rossumc18993f2002-08-08 15:16:20 +0000217 def _getclosed(self):
218 return self._sock is not None
219 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):
229 self.close()
230
231 def flush(self):
232 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000233 buffer = "".join(self._wbuf)
234 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000235 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000236
Neal Norwitz2b342902002-06-13 22:18:39 +0000237 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000238 return self._sock.fileno()
239
240 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000241 data = str(data) # XXX Should really reject non-string non-buffers
242 if not data:
243 return
244 self._wbuf.append(data)
245 if (self._wbufsize == 0 or
246 self._wbufsize == 1 and '\n' in data or
247 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000248 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000249
250 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000251 # XXX We could do better here for very long lists
252 # XXX Should really reject non-string non-buffers
253 self._wbuf.extend(filter(None, map(str, list)))
254 if (self._wbufsize <= 1 or
255 self._get_wbuf_len() >= self._wbufsize):
256 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000257
Guido van Rossum443fec32002-08-08 01:02:16 +0000258 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000259 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000260 for x in self._wbuf:
261 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000262 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000263
Guido van Rossum443fec32002-08-08 01:02:16 +0000264 def _get_rbuf_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._rbuf:
267 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000268 return buf_len
269
270 def read(self, size=-1):
Guido van Rossum443fec32002-08-08 01:02:16 +0000271 if size < 0:
272 # Read until EOF
273 if self._rbufsize <= 1:
274 recv_size = self.default_bufsize
275 else:
276 recv_size = self._rbufsize
277 while 1:
278 data = self._sock.recv(recv_size)
279 if not data:
280 break
281 self._rbuf.append(data)
282 else:
283 buf_len = self._get_rbuf_len()
284 while buf_len < size:
285 recv_size = max(self._rbufsize, size - buf_len)
286 data = self._sock.recv(recv_size)
287 if not data:
288 break
289 buf_len += len(data)
290 self._rbuf.append(data)
291 data = "".join(self._rbuf)
292 self._rbuf = []
293 if 0 <= size < buf_len:
Neal Norwitz2b342902002-06-13 22:18:39 +0000294 self._rbuf.append(data[size:])
295 data = data[:size]
Fred Drakea6070f02000-08-16 14:14:32 +0000296 return data
297
Guido van Rossum67f7a382002-06-06 21:08:16 +0000298 def readline(self, size=-1):
Guido van Rossum443fec32002-08-08 01:02:16 +0000299 data_len = 0
300 for index, x in enumerate(self._rbuf):
301 data_len += len(x)
302 if '\n' in x or 0 <= size <= data_len:
303 index += 1
304 data = "".join(self._rbuf[:index])
305 end = data.find('\n')
306 if end < 0:
307 end = len(data)
308 else:
309 end += 1
310 if 0 <= size < end:
311 end = size
312 data, rest = data[:end], data[end:]
313 if rest:
314 self._rbuf[:index] = [rest]
315 else:
316 del self._rbuf[:index]
317 return data
318 recv_size = self._rbufsize
319 while 1:
320 if size >= 0:
321 recv_size = min(self._rbufsize, size - data_len)
322 x = self._sock.recv(recv_size)
323 if not x:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000324 break
Guido van Rossum443fec32002-08-08 01:02:16 +0000325 data_len += len(x)
326 self._rbuf.append(x)
327 if '\n' in x or 0 <= size <= data_len:
328 break
329 data = "".join(self._rbuf)
330 end = data.find('\n')
331 if end < 0:
332 end = len(data)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000333 else:
Guido van Rossum443fec32002-08-08 01:02:16 +0000334 end += 1
335 if 0 <= size < end:
336 end = size
337 data, rest = data[:end], data[end:]
338 if rest:
339 self._rbuf = [rest]
340 else:
341 self._rbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000342 return data
343
344 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000345 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000346 list = []
347 while 1:
348 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000349 if not line:
350 break
Fred Drakea6070f02000-08-16 14:14:32 +0000351 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000352 total += len(line)
353 if sizehint and total >= sizehint:
354 break
Fred Drakea6070f02000-08-16 14:14:32 +0000355 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000356
357 # Iterator protocols
358
359 def __iter__(self):
360 return self
361
362 def next(self):
363 line = self.readline()
364 if not line:
365 raise StopIteration
366 return line