blob: 6a9a381b7488e095f96e88bbb742db04c2cd704c [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
Dave Cole331708b2004-08-09 04:51:41 +000013socketpair() -- create a pair of new socket objects [*]
Fred Drakea6070f02000-08-16 14:14:32 +000014fromfd() -- create a socket object from an open file descriptor [*]
15gethostname() -- return the current hostname
16gethostbyname() -- map a hostname to its IP number
17gethostbyaddr() -- map an IP number or hostname to DNS info
18getservbyname() -- map a service name and a protocol name to a port number
19getprotobyname() -- mape a protocol name (e.g. 'tcp') to a number
20ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
21htons(), htonl() -- convert 16, 32 bit int from host to network byte order
22inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
23inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000024socket.getdefaulttimeout() -- get the default timeout value
25socket.setdefaulttimeout() -- set the default timeout value
Guido van Rossumd8faa362007-04-27 19:54:29 +000026create_connection() -- connects to an address, with an optional timeout
Fred Drakea6070f02000-08-16 14:14:32 +000027
28 [*] not available on all platforms!
29
30Special objects:
31
32SocketType -- type object for socket objects
33error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000034has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000035
36Integer constants:
37
38AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
39SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
40
41Many other constants may be defined; these may be used in calls to
42the setsockopt() and getsockopt() methods.
43"""
44
Tim Peters18e67782002-02-17 04:25:24 +000045import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000046from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000047
Guido van Rossum7d0a8262007-05-21 23:13:11 +000048import os, sys, io
Fred Drakea6070f02000-08-16 14:14:32 +000049
Fred Drake70d566b2003-04-29 19:50:25 +000050try:
51 from errno import EBADF
52except ImportError:
53 EBADF = 9
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))
Thomas Wouters47b49bf2007-08-30 22:15:33 +000057
58
59_realsocket = socket
Skip Montanaro0de65802001-02-15 22:15:14 +000060
Fred Drakea6070f02000-08-16 14:14:32 +000061# WSA error codes
62if sys.platform.lower().startswith("win"):
63 errorTab = {}
64 errorTab[10004] = "The operation was interrupted."
65 errorTab[10009] = "A bad file handle was passed."
66 errorTab[10013] = "Permission denied."
67 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
68 errorTab[10022] = "An invalid operation was attempted."
69 errorTab[10035] = "The socket operation would block"
70 errorTab[10036] = "A blocking operation is already in progress."
71 errorTab[10048] = "The network address is in use."
72 errorTab[10054] = "The connection has been reset."
73 errorTab[10058] = "The network has been shut down."
74 errorTab[10060] = "The operation timed out."
75 errorTab[10061] = "Connection refused."
76 errorTab[10063] = "The name is too long."
77 errorTab[10064] = "The host is down."
78 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000079 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000080
Fred Drakea6070f02000-08-16 14:14:32 +000081
Guido van Rossum93adc5d2007-07-17 20:41:19 +000082# True if os.dup() can duplicate socket descriptors.
83# (On Windows at least, os.dup only works on files)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +000084_can_dup_socket = hasattr(_socket.socket, "dup")
Guido van Rossum93adc5d2007-07-17 20:41:19 +000085
86if _can_dup_socket:
Guido van Rossum7d0a8262007-05-21 23:13:11 +000087 def fromfd(fd, family=AF_INET, type=SOCK_STREAM, proto=0):
88 nfd = os.dup(fd)
89 return socket(family, type, proto, fileno=nfd)
90
Guido van Rossum7d0a8262007-05-21 23:13:11 +000091class socket(_socket.socket):
92
93 """A subclass of _socket.socket adding the makefile() method."""
94
Guido van Rossum86bc33c2007-11-14 22:32:02 +000095 __slots__ = ["__weakref__", "_io_refs", "_closed"]
Guido van Rossum93adc5d2007-07-17 20:41:19 +000096 if not _can_dup_socket:
Guido van Rossum7d0a8262007-05-21 23:13:11 +000097 __slots__.append("_base")
98
Jeremy Hylton5accbdb2007-08-03 20:40:09 +000099 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None):
100 if fileno is None:
101 _socket.socket.__init__(self, family, type, proto)
102 else:
103 _socket.socket.__init__(self, family, type, proto, fileno)
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000104 self._io_refs = 0
105 self._closed = False
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000106
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000107 def __repr__(self):
108 """Wrap __repr__() to reveal the real class name."""
109 s = _socket.socket.__repr__(self)
110 if s.startswith("<socket object"):
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000111 s = "<%s.%s%s%s" % (self.__class__.__module__,
112 self.__class__.__name__,
113 (self._closed and " [closed] ") or "",
114 s[7:])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000115 return s
116
117 def accept(self):
118 """Wrap accept() to give the connection the right type."""
119 conn, addr = _socket.socket.accept(self)
120 fd = conn.fileno()
121 nfd = fd
Guido van Rossum93adc5d2007-07-17 20:41:19 +0000122 if _can_dup_socket:
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000123 nfd = os.dup(fd)
124 wrapper = socket(self.family, self.type, self.proto, fileno=nfd)
125 if fd == nfd:
126 wrapper._base = conn # Keep the base alive
127 else:
128 conn.close()
129 return wrapper, addr
130
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000131 def makefile(self, mode="r", buffering=None, *,
132 encoding=None, newline=None):
133 """Return an I/O stream connected to the socket.
134
135 The arguments are as for io.open() after the filename,
136 except the only mode characters supported are 'r', 'w' and 'b'.
137 The semantics are similar too. (XXX refactor to share code?)
138 """
139 for c in mode:
140 if c not in {"r", "w", "b"}:
141 raise ValueError("invalid mode %r (only r, w, b allowed)")
142 writing = "w" in mode
143 reading = "r" in mode or not writing
144 assert reading or writing
145 binary = "b" in mode
146 rawmode = ""
147 if reading:
148 rawmode += "r"
149 if writing:
150 rawmode += "w"
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000151 raw = SocketIO(self, rawmode)
152 self._io_refs += 1
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000153 if buffering is None:
154 buffering = -1
155 if buffering < 0:
156 buffering = io.DEFAULT_BUFFER_SIZE
157 if buffering == 0:
158 if not binary:
159 raise ValueError("unbuffered streams must be binary")
160 raw.name = self.fileno()
161 raw.mode = mode
162 return raw
163 if reading and writing:
164 buffer = io.BufferedRWPair(raw, raw, buffering)
165 elif reading:
166 buffer = io.BufferedReader(raw, buffering)
167 else:
168 assert writing
169 buffer = io.BufferedWriter(raw, buffering)
170 if binary:
171 buffer.name = self.fileno()
172 buffer.mode = mode
173 return buffer
174 text = io.TextIOWrapper(buffer, encoding, newline)
175 text.name = self.fileno()
Guido van Rossum93adc5d2007-07-17 20:41:19 +0000176 text.mode = mode
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000177 return text
178
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000179 def _decref_socketios(self):
180 if self._io_refs > 0:
181 self._io_refs -= 1
182 if self._closed:
183 self.close()
184
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000185 def close(self):
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000186 self._closed = True
187 if self._io_refs < 1:
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000188 self._real_close()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000189
190 # _real_close calls close on the _socket.socket base class.
191
192 if not _can_dup_socket:
193 def _real_close(self):
194 _socket.socket.close(self)
195 base = getattr(self, "_base", None)
196 if base is not None:
197 self._base = None
198 base.close()
199 else:
200 def _real_close(self):
201 _socket.socket.close(self)
202
203
204class SocketIO(io.RawIOBase):
205
206 """Raw I/O implementation for stream sockets.
207
208 This class supports the makefile() method on sockets. It provides
209 the raw I/O interface on top of a socket object.
210 """
211
212 # XXX More docs
213
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000214 def __init__(self, sock, mode):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000215 if mode not in ("r", "w", "rw"):
216 raise ValueError("invalid mode: %r" % mode)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000217 io.RawIOBase.__init__(self)
218 self._sock = sock
219 self._mode = mode
Guido van Rossum5abbf752007-08-27 17:39:33 +0000220 self._reading = "r" in mode
221 self._writing = "w" in mode
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000222
223 def readinto(self, b):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000224 self._checkClosed()
225 self._checkReadable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000226 return self._sock.recv_into(b)
227
228 def write(self, b):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000229 self._checkClosed()
230 self._checkWritable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000231 return self._sock.send(b)
232
233 def readable(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000234 return self._reading and not self.closed
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000235
236 def writable(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000237 return self._writing and not self.closed
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000238
239 def fileno(self):
240 return self._sock.fileno()
241
242 def close(self):
243 if self.closed:
244 return
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000245 io.RawIOBase.close(self)
246
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000247 def __del__(self):
248 self._sock._decref_socketios()
249
Fred Drakea6070f02000-08-16 14:14:32 +0000250
251def getfqdn(name=''):
252 """Get fully qualified domain name from name.
253
254 An empty argument is interpreted as meaning the local host.
255
256 First the hostname returned by gethostbyaddr() is checked, then
257 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000258 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000259 """
260 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000261 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000262 name = gethostname()
263 try:
264 hostname, aliases, ipaddrs = gethostbyaddr(name)
265 except error:
266 pass
267 else:
268 aliases.insert(0, hostname)
269 for name in aliases:
270 if '.' in name:
271 break
272 else:
273 name = hostname
274 return name
275
276
Guido van Rossumd8faa362007-04-27 19:54:29 +0000277def create_connection(address, timeout=None):
278 """Connect to address (host, port) with an optional timeout.
279
280 Provides access to socketobject timeout for higher-level
281 protocols. Passing a timeout will set the timeout on the
282 socket instance (if not present, or passed as None, the
283 default global timeout setting will be used).
284 """
285
286 msg = "getaddrinfo returns an empty list"
287 host, port = address
288 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
289 af, socktype, proto, canonname, sa = res
290 sock = None
291 try:
292 sock = socket(af, socktype, proto)
293 if timeout is not None:
294 sock.settimeout(timeout)
295 sock.connect(sa)
296 return sock
297
298 except error as err:
299 msg = err
300 if sock is not None:
301 sock.close()
302
303 raise error(msg)