blob: ba54ec59be1fe02d62d1447f79dcd3c69b39e189 [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
46SSL_EXISTS = 1
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000047try:
Tim Peters18e67782002-02-17 04:25:24 +000048 import _ssl
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000049 from _ssl import *
50except ImportError:
Tim Peters18e67782002-02-17 04:25:24 +000051 SSL_EXISTS = 0
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
Fred Drakea6070f02000-08-16 14:14:32 +000059if (sys.platform.lower().startswith("win")
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000060 or (hasattr(os, 'uname') and os.uname()[0] == "BeOS")
Tim Peters18e67782002-02-17 04:25:24 +000061 or sys.platform=="riscos"):
Fred Drakea6070f02000-08-16 14:14:32 +000062
Guido van Rossum3f69f212001-03-22 22:12:17 +000063 _realsocketcall = _socket.socket
Fred Drakea6070f02000-08-16 14:14:32 +000064
Tim Peters6be14752002-07-31 17:48:02 +000065 def socket(family=AF_INET, type=SOCK_STREAM, proto=0):
66 return _socketobject(_realsocketcall(family, type, proto))
Tim Peters8c3fb872002-07-31 17:32:11 +000067 socket.__doc__ = _realsocketcall.__doc__
Fred Drakea6070f02000-08-16 14:14:32 +000068
Tim Peters18e67782002-02-17 04:25:24 +000069 if SSL_EXISTS:
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000070 _realsslcall = _ssl.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
Tim Petersa19a1682001-03-29 04:36:09 +000074 return _realsslcall(sock, keyfile, certfile)
Guido van Rossum3f69f212001-03-22 22:12:17 +000075
Tim Peters18e67782002-02-17 04:25:24 +000076del _socket
77if SSL_EXISTS:
78 del _ssl
79del SSL_EXISTS
Fred Drakea6070f02000-08-16 14:14:32 +000080
81# WSA error codes
82if sys.platform.lower().startswith("win"):
83 errorTab = {}
84 errorTab[10004] = "The operation was interrupted."
85 errorTab[10009] = "A bad file handle was passed."
86 errorTab[10013] = "Permission denied."
87 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
88 errorTab[10022] = "An invalid operation was attempted."
89 errorTab[10035] = "The socket operation would block"
90 errorTab[10036] = "A blocking operation is already in progress."
91 errorTab[10048] = "The network address is in use."
92 errorTab[10054] = "The connection has been reset."
93 errorTab[10058] = "The network has been shut down."
94 errorTab[10060] = "The operation timed out."
95 errorTab[10061] = "Connection refused."
96 errorTab[10063] = "The name is too long."
97 errorTab[10064] = "The host is down."
98 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000099 __all__.append("errorTab")
Fred Drakea6070f02000-08-16 14:14:32 +0000100del os, sys
101
102
103def getfqdn(name=''):
104 """Get fully qualified domain name from name.
105
106 An empty argument is interpreted as meaning the local host.
107
108 First the hostname returned by gethostbyaddr() is checked, then
109 possibly existing aliases. In case no FQDN is available, hostname
110 is returned.
111 """
112 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000113 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000114 name = gethostname()
115 try:
116 hostname, aliases, ipaddrs = gethostbyaddr(name)
117 except error:
118 pass
119 else:
120 aliases.insert(0, hostname)
121 for name in aliases:
122 if '.' in name:
123 break
124 else:
125 name = hostname
126 return name
127
128
129#
130# These classes are used by the socket() defined on Windows and BeOS
131# platforms to provide a best-effort implementation of the cleanup
132# semantics needed when sockets can't be dup()ed.
133#
134# These are not actually used on other platforms.
135#
136
Guido van Rossume5e50592001-08-18 01:23:20 +0000137_socketmethods = (
138 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
139 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000140 'recv', 'recvfrom', 'send', 'sendall', 'sendto', 'setblocking',
141 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000142
Fred Drakea6070f02000-08-16 14:14:32 +0000143class _socketobject:
144
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000145 class _closedsocket:
146 def __getattr__(self, name):
147 raise error(9, 'Bad file descriptor')
148
Fred Drakea6070f02000-08-16 14:14:32 +0000149 def __init__(self, sock):
150 self._sock = sock
151
152 def close(self):
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000153 # Avoid referencing globals here
154 self._sock = self.__class__._closedsocket()
Fred Drakea6070f02000-08-16 14:14:32 +0000155
156 def __del__(self):
157 self.close()
158
159 def accept(self):
160 sock, addr = self._sock.accept()
161 return _socketobject(sock), addr
162
163 def dup(self):
164 return _socketobject(self._sock)
165
166 def makefile(self, mode='r', bufsize=-1):
167 return _fileobject(self._sock, mode, bufsize)
168
Guido van Rossume5e50592001-08-18 01:23:20 +0000169 _s = "def %s(self, *args): return self._sock.%s(*args)\n\n"
170 for _m in _socketmethods:
Fred Drakea6070f02000-08-16 14:14:32 +0000171 exec _s % (_m, _m)
172
173
174class _fileobject:
Guido van Rossum443fec32002-08-08 01:02:16 +0000175 """Faux file object attached to a socket object."""
176
177 default_bufsize = 8192
Fred Drakea6070f02000-08-16 14:14:32 +0000178
Guido van Rossume9f66142002-08-07 15:46:19 +0000179 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000180 self._sock = sock
Guido van Rossum443fec32002-08-08 01:02:16 +0000181 self._mode = mode # Not actually used in this version
182 if bufsize < 0:
183 bufsize = self.default_bufsize
184 if bufsize == 0:
185 self._rbufsize = 1
186 elif bufsize == 1:
187 self._rbufsize = self.default_bufsize
188 else:
189 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000190 self._wbufsize = bufsize
Guido van Rossum443fec32002-08-08 01:02:16 +0000191 # The buffers are lists of non-empty strings
192 self._rbuf = []
193 self._wbuf = []
Fred Drakea6070f02000-08-16 14:14:32 +0000194
195 def close(self):
196 try:
197 if self._sock:
198 self.flush()
199 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000200 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000201
202 def __del__(self):
203 self.close()
204
205 def flush(self):
206 if self._wbuf:
Guido van Rossum443fec32002-08-08 01:02:16 +0000207 buffer = "".join(self._wbuf)
208 self._wbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000209 self._sock.sendall(buffer)
Fred Drakea6070f02000-08-16 14:14:32 +0000210
Neal Norwitz2b342902002-06-13 22:18:39 +0000211 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000212 return self._sock.fileno()
213
214 def write(self, data):
Guido van Rossum443fec32002-08-08 01:02:16 +0000215 data = str(data) # XXX Should really reject non-string non-buffers
216 if not data:
217 return
218 self._wbuf.append(data)
219 if (self._wbufsize == 0 or
220 self._wbufsize == 1 and '\n' in data or
221 self._get_wbuf_len() >= self._wbufsize):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000222 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000223
224 def writelines(self, list):
Guido van Rossum443fec32002-08-08 01:02:16 +0000225 # XXX We could do better here for very long lists
226 # XXX Should really reject non-string non-buffers
227 self._wbuf.extend(filter(None, map(str, list)))
228 if (self._wbufsize <= 1 or
229 self._get_wbuf_len() >= self._wbufsize):
230 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000231
Guido van Rossum443fec32002-08-08 01:02:16 +0000232 def _get_wbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000233 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000234 for x in self._wbuf:
235 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000236 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000237
Guido van Rossum443fec32002-08-08 01:02:16 +0000238 def _get_rbuf_len(self):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000239 buf_len = 0
Guido van Rossum443fec32002-08-08 01:02:16 +0000240 for x in self._rbuf:
241 buf_len += len(x)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000242 return buf_len
243
244 def read(self, size=-1):
Guido van Rossum443fec32002-08-08 01:02:16 +0000245 if size < 0:
246 # Read until EOF
247 if self._rbufsize <= 1:
248 recv_size = self.default_bufsize
249 else:
250 recv_size = self._rbufsize
251 while 1:
252 data = self._sock.recv(recv_size)
253 if not data:
254 break
255 self._rbuf.append(data)
256 else:
257 buf_len = self._get_rbuf_len()
258 while buf_len < size:
259 recv_size = max(self._rbufsize, size - buf_len)
260 data = self._sock.recv(recv_size)
261 if not data:
262 break
263 buf_len += len(data)
264 self._rbuf.append(data)
265 data = "".join(self._rbuf)
266 self._rbuf = []
267 if 0 <= size < buf_len:
Neal Norwitz2b342902002-06-13 22:18:39 +0000268 self._rbuf.append(data[size:])
269 data = data[:size]
Fred Drakea6070f02000-08-16 14:14:32 +0000270 return data
271
Guido van Rossum67f7a382002-06-06 21:08:16 +0000272 def readline(self, size=-1):
Guido van Rossum443fec32002-08-08 01:02:16 +0000273 data_len = 0
274 for index, x in enumerate(self._rbuf):
275 data_len += len(x)
276 if '\n' in x or 0 <= size <= data_len:
277 index += 1
278 data = "".join(self._rbuf[:index])
279 end = data.find('\n')
280 if end < 0:
281 end = len(data)
282 else:
283 end += 1
284 if 0 <= size < end:
285 end = size
286 data, rest = data[:end], data[end:]
287 if rest:
288 self._rbuf[:index] = [rest]
289 else:
290 del self._rbuf[:index]
291 return data
292 recv_size = self._rbufsize
293 while 1:
294 if size >= 0:
295 recv_size = min(self._rbufsize, size - data_len)
296 x = self._sock.recv(recv_size)
297 if not x:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000298 break
Guido van Rossum443fec32002-08-08 01:02:16 +0000299 data_len += len(x)
300 self._rbuf.append(x)
301 if '\n' in x or 0 <= size <= data_len:
302 break
303 data = "".join(self._rbuf)
304 end = data.find('\n')
305 if end < 0:
306 end = len(data)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000307 else:
Guido van Rossum443fec32002-08-08 01:02:16 +0000308 end += 1
309 if 0 <= size < end:
310 end = size
311 data, rest = data[:end], data[end:]
312 if rest:
313 self._rbuf = [rest]
314 else:
315 self._rbuf = []
Guido van Rossum67f7a382002-06-06 21:08:16 +0000316 return data
317
318 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000319 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000320 list = []
321 while 1:
322 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000323 if not line:
324 break
Fred Drakea6070f02000-08-16 14:14:32 +0000325 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000326 total += len(line)
327 if sizehint and total >= sizehint:
328 break
Fred Drakea6070f02000-08-16 14:14:32 +0000329 return list
Guido van Rossum443fec32002-08-08 01:02:16 +0000330
331 # Iterator protocols
332
333 def __iter__(self):
334 return self
335
336 def next(self):
337 line = self.readline()
338 if not line:
339 raise StopIteration
340 return line