blob: 0daeadcb3483b9a3974f19dd3493a1709b2ae739 [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 Rossumfb3deec2002-08-08 17:16:09 +0000213 self._rbuf = "" # A string
214 self._wbuf = [] # A list of strings
Fred Drakea6070f02000-08-16 14:14:32 +0000215
Guido van Rossumc18993f2002-08-08 15:16:20 +0000216 def _getclosed(self):
217 return self._sock is not None
218 closed = property(_getclosed, doc="True if the file is closed")
219
Fred Drakea6070f02000-08-16 14:14:32 +0000220 def close(self):
221 try:
222 if self._sock:
223 self.flush()
224 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000225 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000226
227 def __del__(self):
228 self.close()
229
230 def flush(self):
231 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000232 buffer = "".join(self._wbuf)
233 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000234 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000235
Neal Norwitz2b342902002-06-13 22:18:39 +0000236 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000237 return self._sock.fileno()
238
239 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000240 data = str(data) # XXX Should really reject non-string non-buffers
241 if not data:
242 return
243 self._wbuf.append(data)
244 if (self._wbufsize == 0 or
245 self._wbufsize == 1 and '\n' in data or
246 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000247 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000248
249 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000250 # XXX We could do better here for very long lists
251 # XXX Should really reject non-string non-buffers
252 self._wbuf.extend(filter(None, map(str, list)))
253 if (self._wbufsize <= 1 or
254 self._get_wbuf_len() >= self._wbufsize):
255 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000256
Guido van Rossum443fec32002-08-08 01:02:16 +0000257 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000258 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000259 for x in self._wbuf:
260 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000261 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000262
Guido van Rossum67f7a382002-06-06 21:08:16 +0000263 def read(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000264 data = self._rbuf
Guido van Rossum443fec32002-08-08 01:02:16 +0000265 if size < 0:
266 # Read until EOF
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000267 buffers = []
268 if data:
269 buffers.append(data)
270 self._rbuf = ""
Guido van Rossum443fec32002-08-08 01:02:16 +0000271 if self._rbufsize <= 1:
272 recv_size = self.default_bufsize
273 else:
274 recv_size = self._rbufsize
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000275 while True:
Guido van Rossum443fec32002-08-08 01:02:16 +0000276 data = self._sock.recv(recv_size)
277 if not data:
278 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000279 buffers.append(data)
280 return "".join(buffers)
Guido van Rossum443fec32002-08-08 01:02:16 +0000281 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000282 # Read until size bytes or EOF seen, whichever comes first
283 buf_len = len(data)
284 if buf_len >= size:
285 self._rbuf = data[size:]
286 return data[:size]
287 buffers = []
288 if data:
289 buffers.append(data)
290 self._rbuf = ""
291 while True:
292 left = size - buf_len
293 recv_size = max(self._rbufsize, left)
Guido van Rossum443fec32002-08-08 01:02:16 +0000294 data = self._sock.recv(recv_size)
295 if not data:
296 break
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000297 buffers.append(data)
298 n = len(data)
299 if n >= left:
300 self._rbuf = data[left:]
301 buffers[-1] = data[:left]
302 break
303 buf_len += n
304 return "".join(buffers)
Fred Drakea6070f02000-08-16 14:14:32 +0000305
Guido van Rossum67f7a382002-06-06 21:08:16 +0000306 def readline(self, size=-1):
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000307 data = self._rbuf
308 if size < 0:
309 # Read until \n or EOF, whichever comes first
Guido van Rossum48b79692002-08-08 17:34:19 +0000310 if self._rbufsize <= 1:
311 # Speed up unbuffered case
312 assert data == ""
313 buffers = []
314 recv = self._sock.recv
315 while data != "\n":
316 data = recv(1)
317 if not data:
318 break
319 buffers.append(data)
320 return "".join(buffers)
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000321 nl = data.find('\n')
322 if nl >= 0:
323 nl += 1
324 self._rbuf = data[nl:]
325 return data[:nl]
326 buffers = []
327 if data:
328 buffers.append(data)
329 self._rbuf = ""
330 while True:
331 data = self._sock.recv(self._rbufsize)
332 if not data:
333 break
334 buffers.append(data)
335 nl = data.find('\n')
336 if nl >= 0:
337 nl += 1
338 self._rbuf = data[nl:]
339 buffers[-1] = data[:nl]
340 break
341 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000342 else:
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000343 # Read until size bytes or \n or EOF seen, whichever comes first
344 nl = data.find('\n', 0, size)
345 if nl >= 0:
346 nl += 1
347 self._rbuf = data[nl:]
348 return data[:nl]
349 buf_len = len(data)
350 if buf_len >= size:
351 self._rbuf = data[size:]
352 return data[:size]
353 buffers = []
354 if data:
355 buffers.append(data)
356 self._rbuf = ""
357 while True:
358 data = self._sock.recv(self._rbufsize)
359 if not data:
360 break
361 buffers.append(data)
362 left = size - buf_len
363 nl = data.find('\n', 0, left)
364 if nl >= 0:
365 nl += 1
366 self._rbuf = data[nl:]
367 buffers[-1] = data[:nl]
368 break
369 n = len(data)
370 if n >= left:
371 self._rbuf = data[left:]
372 buffers[-1] = data[:left]
373 break
374 buf_len += n
375 return "".join(buffers)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000376
377 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000378 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000379 list = []
Guido van Rossumfb3deec2002-08-08 17:16:09 +0000380 while True:
Fred Drakea6070f02000-08-16 14:14:32 +0000381 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000382 if not line:
383 break
Fred Drakea6070f02000-08-16 14:14:32 +0000384 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000385 total += len(line)
386 if sizehint and total >= sizehint:
387 break
Fred Drakea6070f02000-08-16 14:14:32 +0000388 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000389
390 # Iterator protocols
391
392 def __iter__(self):
393 return self
394
395 def next(self):
396 line = self.readline()
397 if not line:
398 raise StopIteration
399 return line