blob: 04e2e33f05045331d73027d218239093cd189aa6 [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)
24
25 [*] not available on all platforms!
26
27Special objects:
28
29SocketType -- type object for socket objects
30error -- exception raised for I/O errors
31
32Integer constants:
33
34AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
35SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
36
37Many other constants may be defined; these may be used in calls to
38the setsockopt() and getsockopt() methods.
39"""
40
Tim Peters18e67782002-02-17 04:25:24 +000041import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000042from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000043
44SSL_EXISTS = 1
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000045try:
Tim Peters18e67782002-02-17 04:25:24 +000046 import _ssl
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000047 from _ssl import *
48except ImportError:
Tim Peters18e67782002-02-17 04:25:24 +000049 SSL_EXISTS = 0
Fred Drakea6070f02000-08-16 14:14:32 +000050
51import os, sys
52
Skip Montanaro0de65802001-02-15 22:15:14 +000053__all__ = ["getfqdn"]
Skip Montanaro0de65802001-02-15 22:15:14 +000054__all__.extend(os._get_exports_list(_socket))
Tim Peters18e67782002-02-17 04:25:24 +000055# XXX shouldn't there be something similar to the above for _ssl exports?
Skip Montanaro0de65802001-02-15 22:15:14 +000056
Fred Drakea6070f02000-08-16 14:14:32 +000057if (sys.platform.lower().startswith("win")
Guido van Rossumd74fb6b2001-03-02 06:43:49 +000058 or (hasattr(os, 'uname') and os.uname()[0] == "BeOS")
Tim Peters18e67782002-02-17 04:25:24 +000059 or sys.platform=="riscos"):
Fred Drakea6070f02000-08-16 14:14:32 +000060
Guido van Rossum3f69f212001-03-22 22:12:17 +000061 _realsocketcall = _socket.socket
Fred Drakea6070f02000-08-16 14:14:32 +000062
63 def socket(family, type, proto=0):
64 return _socketobject(_realsocketcall(family, type, proto))
65
Tim Peters18e67782002-02-17 04:25:24 +000066 if SSL_EXISTS:
Marc-André Lemburga5d2b4c2002-02-16 18:23:30 +000067 _realsslcall = _ssl.ssl
Guido van Rossum3f69f212001-03-22 22:12:17 +000068 def ssl(sock, keyfile=None, certfile=None):
69 if hasattr(sock, "_sock"):
70 sock = sock._sock
Tim Petersa19a1682001-03-29 04:36:09 +000071 return _realsslcall(sock, keyfile, certfile)
Guido van Rossum3f69f212001-03-22 22:12:17 +000072
Tim Peters18e67782002-02-17 04:25:24 +000073del _socket
74if SSL_EXISTS:
75 del _ssl
76del SSL_EXISTS
Fred Drakea6070f02000-08-16 14:14:32 +000077
78# WSA error codes
79if sys.platform.lower().startswith("win"):
80 errorTab = {}
81 errorTab[10004] = "The operation was interrupted."
82 errorTab[10009] = "A bad file handle was passed."
83 errorTab[10013] = "Permission denied."
84 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
85 errorTab[10022] = "An invalid operation was attempted."
86 errorTab[10035] = "The socket operation would block"
87 errorTab[10036] = "A blocking operation is already in progress."
88 errorTab[10048] = "The network address is in use."
89 errorTab[10054] = "The connection has been reset."
90 errorTab[10058] = "The network has been shut down."
91 errorTab[10060] = "The operation timed out."
92 errorTab[10061] = "Connection refused."
93 errorTab[10063] = "The name is too long."
94 errorTab[10064] = "The host is down."
95 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000096 __all__.append("errorTab")
Fred Drakea6070f02000-08-16 14:14:32 +000097del os, sys
98
99
100def getfqdn(name=''):
101 """Get fully qualified domain name from name.
102
103 An empty argument is interpreted as meaning the local host.
104
105 First the hostname returned by gethostbyaddr() is checked, then
106 possibly existing aliases. In case no FQDN is available, hostname
107 is returned.
108 """
109 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000110 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000111 name = gethostname()
112 try:
113 hostname, aliases, ipaddrs = gethostbyaddr(name)
114 except error:
115 pass
116 else:
117 aliases.insert(0, hostname)
118 for name in aliases:
119 if '.' in name:
120 break
121 else:
122 name = hostname
123 return name
124
125
126#
127# These classes are used by the socket() defined on Windows and BeOS
128# platforms to provide a best-effort implementation of the cleanup
129# semantics needed when sockets can't be dup()ed.
130#
131# These are not actually used on other platforms.
132#
133
Guido van Rossume5e50592001-08-18 01:23:20 +0000134_socketmethods = (
135 'bind', 'connect', 'connect_ex', 'fileno', 'listen',
136 'getpeername', 'getsockname', 'getsockopt', 'setsockopt',
Guido van Rossum67f7a382002-06-06 21:08:16 +0000137 'recv', 'recvfrom', 'send', 'sendall', 'sendto', 'setblocking',
138 'settimeout', 'gettimeout', 'shutdown')
Guido van Rossume5e50592001-08-18 01:23:20 +0000139
Fred Drakea6070f02000-08-16 14:14:32 +0000140class _socketobject:
141
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000142 class _closedsocket:
143 def __getattr__(self, name):
144 raise error(9, 'Bad file descriptor')
145
Fred Drakea6070f02000-08-16 14:14:32 +0000146 def __init__(self, sock):
147 self._sock = sock
148
149 def close(self):
Guido van Rossum99d2fbb2001-12-18 22:22:25 +0000150 # Avoid referencing globals here
151 self._sock = self.__class__._closedsocket()
Fred Drakea6070f02000-08-16 14:14:32 +0000152
153 def __del__(self):
154 self.close()
155
156 def accept(self):
157 sock, addr = self._sock.accept()
158 return _socketobject(sock), addr
159
160 def dup(self):
161 return _socketobject(self._sock)
162
163 def makefile(self, mode='r', bufsize=-1):
164 return _fileobject(self._sock, mode, bufsize)
165
Guido van Rossume5e50592001-08-18 01:23:20 +0000166 _s = "def %s(self, *args): return self._sock.%s(*args)\n\n"
167 for _m in _socketmethods:
Fred Drakea6070f02000-08-16 14:14:32 +0000168 exec _s % (_m, _m)
169
170
171class _fileobject:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000172 """Implements a file object on top of a regular socket object."""
Fred Drakea6070f02000-08-16 14:14:32 +0000173
Guido van Rossum67f7a382002-06-06 21:08:16 +0000174 def __init__(self, sock, mode='rb', bufsize=8192):
Fred Drakea6070f02000-08-16 14:14:32 +0000175 self._sock = sock
176 self._mode = mode
Guido van Rossum67f7a382002-06-06 21:08:16 +0000177 if bufsize <= 0:
Fred Drakea6070f02000-08-16 14:14:32 +0000178 bufsize = 512
Guido van Rossum67f7a382002-06-06 21:08:16 +0000179 self._rbufsize = bufsize
Fred Drakea6070f02000-08-16 14:14:32 +0000180 self._wbufsize = bufsize
Guido van Rossum67f7a382002-06-06 21:08:16 +0000181 self._rbuf = [ ]
182 self._wbuf = [ ]
Fred Drakea6070f02000-08-16 14:14:32 +0000183
184 def close(self):
185 try:
186 if self._sock:
187 self.flush()
188 finally:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000189 self._sock = None
Fred Drakea6070f02000-08-16 14:14:32 +0000190
191 def __del__(self):
192 self.close()
193
194 def flush(self):
195 if self._wbuf:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000196 buffer = ''.join(self._wbuf)
197 self._sock.sendall(buffer)
198 self._wbuf = [ ]
Fred Drakea6070f02000-08-16 14:14:32 +0000199
Guido van Rossum67f7a382002-06-06 21:08:16 +0000200 def fileno (self):
Fred Drakea6070f02000-08-16 14:14:32 +0000201 return self._sock.fileno()
202
203 def write(self, data):
Guido van Rossum67f7a382002-06-06 21:08:16 +0000204 self._wbuf.append (data)
205 # A _wbufsize of 1 means we're doing unbuffered IO.
206 # Flush accordingly.
Fred Drakea6070f02000-08-16 14:14:32 +0000207 if self._wbufsize == 1:
208 if '\n' in data:
Guido van Rossum67f7a382002-06-06 21:08:16 +0000209 self.flush ()
210 elif self.__get_wbuf_len() >= self._wbufsize:
211 self.flush()
Fred Drakea6070f02000-08-16 14:14:32 +0000212
213 def writelines(self, list):
Martin v. Löwise12454f2002-02-16 23:06:19 +0000214 filter(self._sock.sendall, list)
Fred Drakea6070f02000-08-16 14:14:32 +0000215 self.flush()
216
Guido van Rossum67f7a382002-06-06 21:08:16 +0000217 def __get_wbuf_len (self):
218 buf_len = 0
219 for i in [len(x) for x in self._wbuf]:
220 buf_len += i
221 return buf_len
Fred Drakea6070f02000-08-16 14:14:32 +0000222
Guido van Rossum67f7a382002-06-06 21:08:16 +0000223 def __get_rbuf_len(self):
224 buf_len = 0
225 for i in [len(x) for x in self._rbuf]:
226 buf_len += i
227 return buf_len
228
229 def read(self, size=-1):
230 buf_len = self.__get_rbuf_len()
231 while size < 0 or buf_len < size:
232 recv_size = max(self._rbufsize, size - buf_len)
233 data = self._sock.recv(recv_size)
234 if not data:
235 break
236 buf_len += len(data)
237 self._rbuf.append(data)
238 data = ''.join(self._rbuf)
239 # Clear the rbuf at the end so we're not affected by
240 # an exception during a recv
241 self._rbuf = [ ]
242 if buf_len > size and size >= 0:
243 self._rbuf.append(data[size:])
244 data = data[:size]
Fred Drakea6070f02000-08-16 14:14:32 +0000245 return data
246
Guido van Rossum67f7a382002-06-06 21:08:16 +0000247 def readline(self, size=-1):
248 index = -1
249 buf_len = self.__get_rbuf_len()
250 if len (self._rbuf):
251 index = min([x.find('\n') for x in self._rbuf])
252 while index < 0 and (size < 0 or buf_len < size):
253 recv_size = max(self._rbufsize, size - buf_len)
254 data = self._sock.recv(recv_size)
255 if not data:
256 break
257 buf_len += len(data)
258 self._rbuf.append(data)
259 index = data.find('\n')
260 data = ''.join(self._rbuf)
261 self._rbuf = [ ]
262 index = data.find('\n')
263 if index >= 0:
264 index += 1
265 elif buf_len > size:
266 index = size
267 else:
268 index = buf_len
269 self._rbuf.append(data[index:])
270 data = data[:index]
271 return data
272
273 def readlines(self, sizehint=0):
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000274 total = 0
Fred Drakea6070f02000-08-16 14:14:32 +0000275 list = []
276 while 1:
277 line = self.readline()
278 if not line: break
279 list.append(line)
Martin v. Löwis6df27f82000-09-19 11:25:58 +0000280 total += len(line)
281 if sizehint and total >= sizehint:
282 break
Fred Drakea6070f02000-08-16 14:14:32 +0000283 return list