blob: 3611c439c798c866c6784059bc06023dbb3570a0 [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)
Fred Drakea6070f02000-08-16 14:14:32 +0000181
Guido van Rossumc18993f2002-08-08 15:16:20 +0000182if _needwrapper:
183 socket = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000184
Guido van Rossumc18993f2002-08-08 15:16:20 +0000185class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000186 """Faux file object attached to a socket object."""
187
188 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000189 name = "<socket>"
190
191 __slots__ = ["mode", "bufsize", "softspace",
192 # "closed" is a property, see below
193 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000194
Guido van Rossume9f66142002-08-07 15:46:19 +0000195 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000196 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000197 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000198 if bufsize < 0:
199 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000200 self.bufsize = bufsize
201 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000202 if bufsize == 0:
203 self._rbufsize = 1
204 elif bufsize == 1:
205 self._rbufsize = self.default_bufsize
206 else:
207 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000208 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000209 self._rbuf = "" # A string
210 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000211
Guido van Rossumc18993f2002-08-08 15:16:20 +0000212 def _getclosed(self):
213 return self._sock is not None
214 closed = property(_getclosed, doc="True if the file is closed")
215
Fred Drakea6070f02000-08-16 14:14:32 +0000216 def close(self):
217 try:
218 if self._sock:
219 self.flush()
220 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000221 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000222
223 def __del__(self):
224 self.close()
225
226 def flush(self):
227 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000228 buffer = "".join(self._wbuf)
229 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000230 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000231
Neal Norwitz2b342902002-06-13 22:18:39 +0000232 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000233 return self._sock.fileno()
234
235 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000236 data = str(data) # XXX Should really reject non-string non-buffers
237 if not data:
238 return
239 self._wbuf.append(data)
240 if (self._wbufsize == 0 or
241 self._wbufsize == 1 and '\n' in data or
242 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000243 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000244
245 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000246 # XXX We could do better here for very long lists
247 # XXX Should really reject non-string non-buffers
248 self._wbuf.extend(filter(None, map(str, list)))
249 if (self._wbufsize <= 1 or
250 self._get_wbuf_len() >= self._wbufsize):
251 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000252
Guido van Rossum443fec32002-08-08 01:02:16 +0000253 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000254 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000255 for x in self._wbuf:
256 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000257 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000258
Guido van Rossum67f7a382002-06-06 21:08:16 +0000259 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000260 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000261 if size < 0:
262 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000263 buffers = []
264 if data:
265 buffers.append(data)
266 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000267 if self._rbufsize <= 1:
268 recv_size = self.default_bufsize
269 else:
270 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000271 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000272 data = self._sock.recv(recv_size)
273 if not data:
274 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000275 buffers.append(data)
276 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000277 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000278 # Read until size bytes or EOF seen, whichever comes first
279 buf_len = len(data)
280 if buf_len >= size:
281 self._rbuf = data[size:]
282 return data[:size]
283 buffers = []
284 if data:
285 buffers.append(data)
286 self._rbuf = ""
287 while True:
288 left = size - buf_len
289 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000290 data = self._sock.recv(recv_size)
291 if not data:
292 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000293 buffers.append(data)
294 n = len(data)
295 if n >= left:
296 self._rbuf = data[left:]
297 buffers[-1] = data[:left]
298 break
299 buf_len += n
300 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000301
Guido van Rossum67f7a382002-06-06 21:08:16 +0000302 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000303 data = self._rbuf
304 if size < 0:
305 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000306 if self._rbufsize <= 1:
307 # Speed up unbuffered case
308 assert data == ""
309 buffers = []
310 recv = self._sock.recv
311 while data != "\n":
312 data = recv(1)
313 if not data:
314 break
315 buffers.append(data)
316 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000317 nl = data.find('\n')
318 if nl >= 0:
319 nl += 1
320 self._rbuf = data[nl:]
321 return data[:nl]
322 buffers = []
323 if data:
324 buffers.append(data)
325 self._rbuf = ""
326 while True:
327 data = self._sock.recv(self._rbufsize)
328 if not data:
329 break
330 buffers.append(data)
331 nl = data.find('\n')
332 if nl >= 0:
333 nl += 1
334 self._rbuf = data[nl:]
335 buffers[-1] = data[:nl]
336 break
337 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000338 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000339 # Read until size bytes or \n or EOF seen, whichever comes first
340 nl = data.find('\n', 0, size)
341 if nl >= 0:
342 nl += 1
343 self._rbuf = data[nl:]
344 return data[:nl]
345 buf_len = len(data)
346 if buf_len >= size:
347 self._rbuf = data[size:]
348 return data[:size]
349 buffers = []
350 if data:
351 buffers.append(data)
352 self._rbuf = ""
353 while True:
354 data = self._sock.recv(self._rbufsize)
355 if not data:
356 break
357 buffers.append(data)
358 left = size - buf_len
359 nl = data.find('\n', 0, left)
360 if nl >= 0:
361 nl += 1
362 self._rbuf = data[nl:]
363 buffers[-1] = data[:nl]
364 break
365 n = len(data)
366 if n >= left:
367 self._rbuf = data[left:]
368 buffers[-1] = data[:left]
369 break
370 buf_len += n
371 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000372
373 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000374 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000375 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000376 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000377 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000378 if not line:
379 break
Fred Drakea6070f02000-08-16 14:14:32 +0000380 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000381 total += len(line)
382 if sizehint and total >= sizehint:
383 break
Fred Drakea6070f02000-08-16 14:14:32 +0000384 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000385
386 # Iterator protocols
387
388 def __iter__(self):
389 return self
390
391 def next(self):
392 line = self.readline()
393 if not line:
394 raise StopIteration
395 return line