blob: 1573bc055941bd4edcbb0e98db831674aa13c3b7 [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 Rossum67f7a382002-06-06 21:08:16 +0000175 """Implements a file object on top of a regular socket object."""
Fred Drakea6070f02000-08-16 14:14:32 +0000176
Guido van Rossume9f66142002-08-07 15:46:19 +0000177 def __init__(self, sock, mode='rb', bufsize=-1):
Fred Drakea6070f02000-08-16 14:14:32 +0000178 self._sock = sock
179 self._mode = mode
Guido van Rossum67f7a382002-06-06 21:08:16 +0000180 if bufsize <= 0:
Guido van Rossum9ed5ae72002-08-07 19:03:35 +0000181 if bufsize == 0:
182 bufsize = 1 # Unbuffered mode
183 else:
Guido van Rossume9f66142002-08-07 15:46:19 +0000184 bufsize = 8192
Guido van Rossum67f7a382002-06-06 21:08:16 +0000185 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000186 self._wbufsize = bufsize
Guido van Rossum67f7a382002-06-06 21:08:16 +0000187 self._rbuf = [ ]
188 self._wbuf = [ ]
Fred Drakea6070f02000-08-16 14:14:32 +0000189
190 def close(self):
191 try:
192 if self._sock:
193 self.flush()
194 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000195 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000196
197 def __del__(self):
198 self.close()
199
200 def flush(self):
201 if self._wbuf:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000202 buffer = ''.join(self._wbuf)
203 self._sock.sendall(buffer)
204 self._wbuf = [ ]
Fred Drakea6070f02000-08-16 14:14:32 +0000205
Neal Norwitz2b342902002-06-13 22:18:39 +0000206 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000207 return self._sock.fileno()
208
209 def write(self, data):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000210 self._wbuf.append (data)
211 # A _wbufsize of 1 means we're doing unbuffered IO.
212 # Flush accordingly.
Fred Drakea6070f02000-08-16 14:14:32 +0000213 if self._wbufsize == 1:
214 if '\n' in data:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000215 self.flush ()
216 elif self.__get_wbuf_len() >= self._wbufsize:
217 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000218
219 def writelines(self, list):
Martin v. Löwise12454f2002-02-16 23:06:19 +0000220 filter(self._sock.sendall, list)
Fred Drakea6070f02000-08-16 14:14:32 +0000221 self.flush()
222
Guido van Rossum67f7a382002-06-06 21:08:16 +0000223 def __get_wbuf_len (self):
224 buf_len = 0
225 for i in [len(x) for x in self._wbuf]:
226 buf_len += i
227 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000228
Guido van Rossum67f7a382002-06-06 21:08:16 +0000229 def __get_rbuf_len(self):
230 buf_len = 0
231 for i in [len(x) for x in self._rbuf]:
232 buf_len += i
233 return buf_len
234
235 def read(self, size=-1):
236 buf_len = self.__get_rbuf_len()
237 while size < 0 or buf_len < size:
238 recv_size = max(self._rbufsize, size - buf_len)
239 data = self._sock.recv(recv_size)
240 if not data:
241 break
242 buf_len += len(data)
243 self._rbuf.append(data)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000244 # Clear the rbuf at the end so we're not affected by
245 # an exception during a recv
Neal Norwitz2b342902002-06-13 22:18:39 +0000246 data = ''.join(self._rbuf)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000247 self._rbuf = [ ]
248 if buf_len > size and size >= 0:
Neal Norwitz2b342902002-06-13 22:18:39 +0000249 self._rbuf.append(data[size:])
250 data = data[:size]
Fred Drakea6070f02000-08-16 14:14:32 +0000251 return data
252
Guido van Rossum67f7a382002-06-06 21:08:16 +0000253 def readline(self, size=-1):
254 index = -1
255 buf_len = self.__get_rbuf_len()
Neal Norwitz2b342902002-06-13 22:18:39 +0000256 if self._rbuf:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000257 index = min([x.find('\n') for x in self._rbuf])
258 while index < 0 and (size < 0 or 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 index = data.find('\n')
266 data = ''.join(self._rbuf)
267 self._rbuf = [ ]
268 index = data.find('\n')
269 if index >= 0:
270 index += 1
271 elif buf_len > size:
272 index = size
273 else:
274 index = buf_len
275 self._rbuf.append(data[index:])
276 data = data[:index]
277 return data
278
279 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000280 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000281 list = []
282 while 1:
283 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000284 if not line:
285 break
Fred Drakea6070f02000-08-16 14:14:32 +0000286 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000287 total += len(line)
288 if sizehint and total >= sizehint:
289 break
Fred Drakea6070f02000-08-16 14:14:32 +0000290 return list