blob: c351a91cc2b8c906a62b5aaf8b7ba450e1acf29a [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
65 def socket(family, type, proto=0):
66 return _socketobject(_realsocketcall(family, type, proto))
67
Tim Peters18e67782002-02-17 04:25:24 +000068 if SSL_EXISTS:
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000069 _realsslcall = _ssl.ssl
Guido van Rossum3f69f212001-03-22 22:12:17 +000070 def ssl(sock, keyfile=None, certfile=None):
71 if hasattr(sock, "_sock"):
72 sock = sock._sock
Tim Petersa19a1682001-03-29 04:36:09 +000073 return _realsslcall(sock, keyfile, certfile)
Guido van Rossum3f69f212001-03-22 22:12:17 +000074
Tim Peters18e67782002-02-17 04:25:24 +000075del _socket
76if SSL_EXISTS:
77 del _ssl
78del SSL_EXISTS
Fred Drakea6070f02000-08-16 14:14:32 +000079
80# WSA error codes
81if sys.platform.lower().startswith("win"):
82 errorTab = {}
83 errorTab[10004] = "The operation was interrupted."
84 errorTab[10009] = "A bad file handle was passed."
85 errorTab[10013] = "Permission denied."
86 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
87 errorTab[10022] = "An invalid operation was attempted."
88 errorTab[10035] = "The socket operation would block"
89 errorTab[10036] = "A blocking operation is already in progress."
90 errorTab[10048] = "The network address is in use."
91 errorTab[10054] = "The connection has been reset."
92 errorTab[10058] = "The network has been shut down."
93 errorTab[10060] = "The operation timed out."
94 errorTab[10061] = "Connection refused."
95 errorTab[10063] = "The name is too long."
96 errorTab[10064] = "The host is down."
97 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000098 __all__.append("errorTab")
Fred Drakea6070f02000-08-16 14:14:32 +000099del os, sys
100
101
102def getfqdn(name=''):
103 """Get fully qualified domain name from name.
104
105 An empty argument is interpreted as meaning the local host.
106
107 First the hostname returned by gethostbyaddr() is checked, then
108 possibly existing aliases. In case no FQDN is available, hostname
109 is returned.
110 """
111 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000112 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000113 name = gethostname()
114 try:
115 hostname, aliases, ipaddrs = gethostbyaddr(name)
116 except error:
117 pass
118 else:
119 aliases.insert(0, hostname)
120 for name in aliases:
121 if '.' in name:
122 break
123 else:
124 name = hostname
125 return name
126
127
128#
129# These classes are used by the socket() defined on Windows and BeOS
130# platforms to provide a best-effort implementation of the cleanup
131# semantics needed when sockets can't be dup()ed.
132#
133# These are not actually used on other platforms.
134#
135
Guido van Rossume5e50592001-08-18 01:23:20 +0000136_socketmethods = (
137 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
138 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000139 'recv', 'recvfrom', 'send', 'sendall', 'sendto', 'setblocking',
140 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000141
Fred Drakea6070f02000-08-16 14:14:32 +0000142class _socketobject:
143
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000144 class _closedsocket:
145 def __getattr__(self, name):
146 raise error(9, 'Bad file descriptor')
147
Fred Drakea6070f02000-08-16 14:14:32 +0000148 def __init__(self, sock):
149 self._sock = sock
150
151 def close(self):
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000152 # Avoid referencing globals here
153 self._sock = self.__class__._closedsocket()
Fred Drakea6070f02000-08-16 14:14:32 +0000154
155 def __del__(self):
156 self.close()
157
158 def accept(self):
159 sock, addr = self._sock.accept()
160 return _socketobject(sock), addr
161
162 def dup(self):
163 return _socketobject(self._sock)
164
165 def makefile(self, mode='r', bufsize=-1):
166 return _fileobject(self._sock, mode, bufsize)
167
Guido van Rossume5e50592001-08-18 01:23:20 +0000168 _s = "def %s(self, *args): return self._sock.%s(*args)\n\n"
169 for _m in _socketmethods:
Fred Drakea6070f02000-08-16 14:14:32 +0000170 exec _s % (_m, _m)
171
172
173class _fileobject:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000174 """Implements a file object on top of a regular socket object."""
Fred Drakea6070f02000-08-16 14:14:32 +0000175
Guido van Rossum67f7a382002-06-06 21:08:16 +0000176 def __init__(self, sock, mode='rb', bufsize=8192):
Fred Drakea6070f02000-08-16 14:14:32 +0000177 self._sock = sock
178 self._mode = mode
Guido van Rossum67f7a382002-06-06 21:08:16 +0000179 if bufsize <= 0:
Fred Drakea6070f02000-08-16 14:14:32 +0000180 bufsize = 512
Guido van Rossum67f7a382002-06-06 21:08:16 +0000181 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000182 self._wbufsize = bufsize
Guido van Rossum67f7a382002-06-06 21:08:16 +0000183 self._rbuf = [ ]
184 self._wbuf = [ ]
Fred Drakea6070f02000-08-16 14:14:32 +0000185
186 def close(self):
187 try:
188 if self._sock:
189 self.flush()
190 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000191 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000192
193 def __del__(self):
194 self.close()
195
196 def flush(self):
197 if self._wbuf:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000198 buffer = ''.join(self._wbuf)
199 self._sock.sendall(buffer)
200 self._wbuf = [ ]
Fred Drakea6070f02000-08-16 14:14:32 +0000201
Neal Norwitz2b342902002-06-13 22:18:39 +0000202 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000203 return self._sock.fileno()
204
205 def write(self, data):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000206 self._wbuf.append (data)
207 # A _wbufsize of 1 means we're doing unbuffered IO.
208 # Flush accordingly.
Fred Drakea6070f02000-08-16 14:14:32 +0000209 if self._wbufsize == 1:
210 if '\n' in data:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000211 self.flush ()
212 elif self.__get_wbuf_len() >= self._wbufsize:
213 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000214
215 def writelines(self, list):
Martin v. Löwise12454f2002-02-16 23:06:19 +0000216 filter(self._sock.sendall, list)
Fred Drakea6070f02000-08-16 14:14:32 +0000217 self.flush()
218
Guido van Rossum67f7a382002-06-06 21:08:16 +0000219 def __get_wbuf_len (self):
220 buf_len = 0
221 for i in [len(x) for x in self._wbuf]:
222 buf_len += i
223 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000224
Guido van Rossum67f7a382002-06-06 21:08:16 +0000225 def __get_rbuf_len(self):
226 buf_len = 0
227 for i in [len(x) for x in self._rbuf]:
228 buf_len += i
229 return buf_len
230
231 def read(self, size=-1):
232 buf_len = self.__get_rbuf_len()
233 while size < 0 or buf_len < size:
234 recv_size = max(self._rbufsize, size - buf_len)
235 data = self._sock.recv(recv_size)
236 if not data:
237 break
238 buf_len += len(data)
239 self._rbuf.append(data)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000240 # Clear the rbuf at the end so we're not affected by
241 # an exception during a recv
Neal Norwitz2b342902002-06-13 22:18:39 +0000242 data = ''.join(self._rbuf)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000243 self._rbuf = [ ]
244 if buf_len > size and size >= 0:
Neal Norwitz2b342902002-06-13 22:18:39 +0000245 self._rbuf.append(data[size:])
246 data = data[:size]
Fred Drakea6070f02000-08-16 14:14:32 +0000247 return data
248
Guido van Rossum67f7a382002-06-06 21:08:16 +0000249 def readline(self, size=-1):
250 index = -1
251 buf_len = self.__get_rbuf_len()
Neal Norwitz2b342902002-06-13 22:18:39 +0000252 if self._rbuf:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000253 index = min([x.find('\n') for x in self._rbuf])
254 while index < 0 and (size < 0 or buf_len < size):
255 recv_size = max(self._rbufsize, size - buf_len)
256 data = self._sock.recv(recv_size)
257 if not data:
258 break
259 buf_len += len(data)
260 self._rbuf.append(data)
261 index = data.find('\n')
262 data = ''.join(self._rbuf)
263 self._rbuf = [ ]
264 index = data.find('\n')
265 if index >= 0:
266 index += 1
267 elif buf_len > size:
268 index = size
269 else:
270 index = buf_len
271 self._rbuf.append(data[index:])
272 data = data[:index]
273 return data
274
275 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000276 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000277 list = []
278 while 1:
279 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000280 if not line:
281 break
Fred Drakea6070f02000-08-16 14:14:32 +0000282 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000283 total += len(line)
284 if sizehint and total >= sizehint:
285 break
Fred Drakea6070f02000-08-16 14:14:32 +0000286 return list