blob: 7bb00a6a798f4cca22a84bd2c87d9f18daf9e2d7 [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 Peters8c3fb872002-07-31 17:32:11 +000065 def socket(*args):
66 return _socketobject(_realsocketcall(*args))
67 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 Rossum67f7a382002-06-06 21:08:16 +0000177 def __init__(self, sock, mode='rb', bufsize=8192):
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:
Fred Drakea6070f02000-08-16 14:14:32 +0000181 bufsize = 512
Guido van Rossum67f7a382002-06-06 21:08:16 +0000182 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000183 self._wbufsize = bufsize
Guido van Rossum67f7a382002-06-06 21:08:16 +0000184 self._rbuf = [ ]
185 self._wbuf = [ ]
Fred Drakea6070f02000-08-16 14:14:32 +0000186
187 def close(self):
188 try:
189 if self._sock:
190 self.flush()
191 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000192 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000193
194 def __del__(self):
195 self.close()
196
197 def flush(self):
198 if self._wbuf:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000199 buffer = ''.join(self._wbuf)
200 self._sock.sendall(buffer)
201 self._wbuf = [ ]
Fred Drakea6070f02000-08-16 14:14:32 +0000202
Neal Norwitz2b342902002-06-13 22:18:39 +0000203 def fileno(self):
Fred Drakea6070f02000-08-16 14:14:32 +0000204 return self._sock.fileno()
205
206 def write(self, data):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000207 self._wbuf.append (data)
208 # A _wbufsize of 1 means we're doing unbuffered IO.
209 # Flush accordingly.
Fred Drakea6070f02000-08-16 14:14:32 +0000210 if self._wbufsize == 1:
211 if '\n' in data:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000212 self.flush ()
213 elif self.__get_wbuf_len() >= self._wbufsize:
214 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000215
216 def writelines(self, list):
Martin v. Löwise12454f2002-02-16 23:06:19 +0000217 filter(self._sock.sendall, list)
Fred Drakea6070f02000-08-16 14:14:32 +0000218 self.flush()
219
Guido van Rossum67f7a382002-06-06 21:08:16 +0000220 def __get_wbuf_len (self):
221 buf_len = 0
222 for i in [len(x) for x in self._wbuf]:
223 buf_len += i
224 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000225
Guido van Rossum67f7a382002-06-06 21:08:16 +0000226 def __get_rbuf_len(self):
227 buf_len = 0
228 for i in [len(x) for x in self._rbuf]:
229 buf_len += i
230 return buf_len
231
232 def read(self, size=-1):
233 buf_len = self.__get_rbuf_len()
234 while size < 0 or buf_len < size:
235 recv_size = max(self._rbufsize, size - buf_len)
236 data = self._sock.recv(recv_size)
237 if not data:
238 break
239 buf_len += len(data)
240 self._rbuf.append(data)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000241 # Clear the rbuf at the end so we're not affected by
242 # an exception during a recv
Neal Norwitz2b342902002-06-13 22:18:39 +0000243 data = ''.join(self._rbuf)
Guido van Rossum67f7a382002-06-06 21:08:16 +0000244 self._rbuf = [ ]
245 if buf_len > size and size >= 0:
Neal Norwitz2b342902002-06-13 22:18:39 +0000246 self._rbuf.append(data[size:])
247 data = data[:size]
Fred Drakea6070f02000-08-16 14:14:32 +0000248 return data
249
Guido van Rossum67f7a382002-06-06 21:08:16 +0000250 def readline(self, size=-1):
251 index = -1
252 buf_len = self.__get_rbuf_len()
Neal Norwitz2b342902002-06-13 22:18:39 +0000253 if self._rbuf:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000254 index = min([x.find('\n') for x in self._rbuf])
255 while index < 0 and (size < 0 or buf_len < size):
256 recv_size = max(self._rbufsize, size - buf_len)
257 data = self._sock.recv(recv_size)
258 if not data:
259 break
260 buf_len += len(data)
261 self._rbuf.append(data)
262 index = data.find('\n')
263 data = ''.join(self._rbuf)
264 self._rbuf = [ ]
265 index = data.find('\n')
266 if index >= 0:
267 index += 1
268 elif buf_len > size:
269 index = size
270 else:
271 index = buf_len
272 self._rbuf.append(data[index:])
273 data = data[:index]
274 return data
275
276 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000277 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000278 list = []
279 while 1:
280 line = self.readline()
Neal Norwitz2b342902002-06-13 22:18:39 +0000281 if not line:
282 break
Fred Drakea6070f02000-08-16 14:14:32 +0000283 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000284 total += len(line)
285 if sizehint and total >= sizehint:
286 break
Fred Drakea6070f02000-08-16 14:14:32 +0000287 return list