blob: cb0181b2a6c48db62f55924db00935b780c488bd [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
Fred Drakea6070f02000-08-16 14:14:32 +000062if (sys.platform.lower().startswith("win")
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000063 or (hasattr(os, 'uname') and os.uname()[0] == "BeOS")
Tim Peters18e67782002-02-17 04:25:24 +000064 or sys.platform=="riscos"):
Fred Drakea6070f02000-08-16 14:14:32 +000065
Guido van Rossumc18993f2002-08-08 15:16:20 +000066 if _have_ssl:
67 _realssl = ssl
Guido van Rossum3f69f212001-03-22 22:12:17 +000068 def ssl(sock, keyfile=None, certfile=None):
69 if hasattr(sock, "_sock"):
70 sock = sock._sock
Guido van Rossumc18993f2002-08-08 15:16:20 +000071 return _realssl(sock, keyfile, certfile)
Fred Drakea6070f02000-08-16 14:14:32 +000072
73# WSA error codes
74if sys.platform.lower().startswith("win"):
75 errorTab = {}
76 errorTab[10004] = "The operation was interrupted."
77 errorTab[10009] = "A bad file handle was passed."
78 errorTab[10013] = "Permission denied."
79 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
80 errorTab[10022] = "An invalid operation was attempted."
81 errorTab[10035] = "The socket operation would block"
82 errorTab[10036] = "A blocking operation is already in progress."
83 errorTab[10048] = "The network address is in use."
84 errorTab[10054] = "The connection has been reset."
85 errorTab[10058] = "The network has been shut down."
86 errorTab[10060] = "The operation timed out."
87 errorTab[10061] = "Connection refused."
88 errorTab[10063] = "The name is too long."
89 errorTab[10064] = "The host is down."
90 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000091 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000092
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 Rossum715f9702002-08-08 18:11:36 +0000136class _closedsocket(object):
137 __slots__ = []
138 def __getattr__(self, name):
139 raise error(9, 'Bad file descriptor')
140
Guido van Rossumc18993f2002-08-08 15:16:20 +0000141class _socketobject(object):
Fred Drakea6070f02000-08-16 14:14:32 +0000142
Guido van Rossumc18993f2002-08-08 15:16:20 +0000143 __doc__ = _realsocket.__doc__
144
145 __slots__ = ["_sock"]
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:
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000149 _sock = _realsocket(family, type, proto)
Guido van Rossumc18993f2002-08-08 15:16:20 +0000150 self._sock = _sock
Fred Drakea6070f02000-08-16 14:14:32 +0000151
152 def close(self):
Guido van Rossum715f9702002-08-08 18:11:36 +0000153 self._sock = _closedsocket()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000154 close.__doc__ = _realsocket.close.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000155
Fred Drakea6070f02000-08-16 14:14:32 +0000156 def accept(self):
157 sock, addr = self._sock.accept()
Guido van Rossumc18993f2002-08-08 15:16:20 +0000158 return _socketobject(_sock=sock), addr
159 accept.__doc__ = _realsocket.accept.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +0000160
161 def dup(self):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000162 """dup() -> socket object
163
164 Return a new socket object connected to the same system resource."""
165 return _socketobject(_sock=self._sock)
Fred Drakea6070f02000-08-16 14:14:32 +0000166
167 def makefile(self, mode='r', bufsize=-1):
Guido van Rossumc18993f2002-08-08 15:16:20 +0000168 """makefile([mode[, bufsize]]) -> file object
169
170 Return a regular file object corresponding to the socket. The mode
171 and bufsize arguments are as for the built-in open() function."""
Fred Drakea6070f02000-08-16 14:14:32 +0000172 return _fileobject(self._sock, mode, bufsize)
173
Guido van Rossumc18993f2002-08-08 15:16:20 +0000174 _s = ("def %s(self, *args): return self._sock.%s(*args)\n\n"
175 "%s.__doc__ = _realsocket.%s.__doc__\n")
Guido van Rossume5e50592001-08-18 01:23:20 +0000176 for _m in _socketmethods:
Guido van Rossumc18993f2002-08-08 15:16:20 +0000177 exec _s % (_m, _m, _m, _m)
Tim Petersd7e8a0d2002-08-08 20:07:03 +0000178 del _m, _s
Fred Drakea6070f02000-08-16 14:14:32 +0000179
Skip Montanaro89feabc2003-03-30 04:54:24 +0000180socket = SocketType = _socketobject
Fred Drakea6070f02000-08-16 14:14:32 +0000181
Guido van Rossumc18993f2002-08-08 15:16:20 +0000182class _fileobject(object):
Guido van Rossum443fec32002-08-08 01:02:16 +0000183 """Faux file object attached to a socket object."""
184
185 default_bufsize = 8192
Guido van Rossumc18993f2002-08-08 15:16:20 +0000186 name = "<socket>"
187
188 __slots__ = ["mode", "bufsize", "softspace",
189 # "closed" is a property, see below
190 "_sock", "_rbufsize", "_wbufsize", "_rbuf", "_wbuf"]
Fred Drakea6070f02000-08-16 14:14:32 +0000191
Guido van Rossume9f66142002-08-07 15:46:19 +0000192 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000193 self._sock = sock
Guido van Rossumc18993f2002-08-08 15:16:20 +0000194 self.mode = mode # Not actually used in this version
Guido van Rossum443fec32002-08-08 01:02:16 +0000195 if bufsize < 0:
196 bufsize = self.default_bufsize
Guido van Rossum7c3b6342002-08-08 15:22:12 +0000197 self.bufsize = bufsize
198 self.softspace = False
Guido van Rossum443fec32002-08-08 01:02:16 +0000199 if bufsize == 0:
200 self._rbufsize = 1
201 elif bufsize == 1:
202 self._rbufsize = self.default_bufsize
203 else:
204 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000205 self._wbufsize = bufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000206 self._rbuf = "" # A string
207 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000208
Guido van Rossumc18993f2002-08-08 15:16:20 +0000209 def _getclosed(self):
210 return self._sock is not None
211 closed = property(_getclosed, doc="True if the file is closed")
212
Fred Drakea6070f02000-08-16 14:14:32 +0000213 def close(self):
214 try:
215 if self._sock:
216 self.flush()
217 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000218 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000219
220 def __del__(self):
221 self.close()
222
223 def flush(self):
224 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000225 buffer = "".join(self._wbuf)
226 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000227 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000228
Neal Norwitz2b342902002-06-13 22:18:39 +0000229 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000230 return self._sock.fileno()
231
232 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000233 data = str(data) # XXX Should really reject non-string non-buffers
234 if not data:
235 return
236 self._wbuf.append(data)
237 if (self._wbufsize == 0 or
238 self._wbufsize == 1 and '\n' in data or
239 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000240 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000241
242 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000243 # XXX We could do better here for very long lists
244 # XXX Should really reject non-string non-buffers
245 self._wbuf.extend(filter(None, map(str, list)))
246 if (self._wbufsize <= 1 or
247 self._get_wbuf_len() >= self._wbufsize):
248 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000249
Guido van Rossum443fec32002-08-08 01:02:16 +0000250 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000251 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000252 for x in self._wbuf:
253 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000254 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000255
Guido van Rossum67f7a382002-06-06 21:08:16 +0000256 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000257 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000258 if size < 0:
259 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000260 buffers = []
261 if data:
262 buffers.append(data)
263 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000264 if self._rbufsize <= 1:
265 recv_size = self.default_bufsize
266 else:
267 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000268 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000269 data = self._sock.recv(recv_size)
270 if not data:
271 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000272 buffers.append(data)
273 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000274 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000275 # Read until size bytes or EOF seen, whichever comes first
276 buf_len = len(data)
277 if buf_len >= size:
278 self._rbuf = data[size:]
279 return data[:size]
280 buffers = []
281 if data:
282 buffers.append(data)
283 self._rbuf = ""
284 while True:
285 left = size - buf_len
286 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000287 data = self._sock.recv(recv_size)
288 if not data:
289 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000290 buffers.append(data)
291 n = len(data)
292 if n >= left:
293 self._rbuf = data[left:]
294 buffers[-1] = data[:left]
295 break
296 buf_len += n
297 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000298
Guido van Rossum67f7a382002-06-06 21:08:16 +0000299 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000300 data = self._rbuf
301 if size < 0:
302 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000303 if self._rbufsize <= 1:
304 # Speed up unbuffered case
305 assert data == ""
306 buffers = []
307 recv = self._sock.recv
308 while data != "\n":
309 data = recv(1)
310 if not data:
311 break
312 buffers.append(data)
313 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000314 nl = data.find('\n')
315 if nl >= 0:
316 nl += 1
317 self._rbuf = data[nl:]
318 return data[:nl]
319 buffers = []
320 if data:
321 buffers.append(data)
322 self._rbuf = ""
323 while True:
324 data = self._sock.recv(self._rbufsize)
325 if not data:
326 break
327 buffers.append(data)
328 nl = data.find('\n')
329 if nl >= 0:
330 nl += 1
331 self._rbuf = data[nl:]
332 buffers[-1] = data[:nl]
333 break
334 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000335 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000336 # Read until size bytes or \n or EOF seen, whichever comes first
337 nl = data.find('\n', 0, size)
338 if nl >= 0:
339 nl += 1
340 self._rbuf = data[nl:]
341 return data[:nl]
342 buf_len = len(data)
343 if buf_len >= size:
344 self._rbuf = data[size:]
345 return data[:size]
346 buffers = []
347 if data:
348 buffers.append(data)
349 self._rbuf = ""
350 while True:
351 data = self._sock.recv(self._rbufsize)
352 if not data:
353 break
354 buffers.append(data)
355 left = size - buf_len
356 nl = data.find('\n', 0, left)
357 if nl >= 0:
358 nl += 1
359 self._rbuf = data[nl:]
360 buffers[-1] = data[:nl]
361 break
362 n = len(data)
363 if n >= left:
364 self._rbuf = data[left:]
365 buffers[-1] = data[:left]
366 break
367 buf_len += n
368 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000369
370 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000371 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000372 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000373 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000374 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000375 if not line:
376 break
Fred Drakea6070f02000-08-16 14:14:32 +0000377 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000378 total += len(line)
379 if sizehint and total >= sizehint:
380 break
Fred Drakea6070f02000-08-16 14:14:32 +0000381 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000382
383 # Iterator protocols
384
385 def __iter__(self):
386 return self
387
388 def next(self):
389 line = self.readline()
390 if not line:
391 raise StopIteration
392 return line