blob: 004d6a9445fe10765fe92813ab8ecfb6383007ec [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
Mark Dickinson5c91bf32009-06-02 07:41:26 +000019getprotobyname() -- map a protocol name (e.g. 'tcp') to a number
Fred Drakea6070f02000-08-16 14:14:32 +000020ntohs(), 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
Gregory P. Smithb4066372010-01-03 03:28:29 +000026create_connection() -- connects to an address, with an optional timeout and
27 optional source address.
Fred Drakea6070f02000-08-16 14:14:32 +000028
29 [*] not available on all platforms!
30
31Special objects:
32
33SocketType -- type object for socket objects
34error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000035has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000036
37Integer constants:
38
39AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
40SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
41
42Many other constants may be defined; these may be used in calls to
43the setsockopt() and getsockopt() methods.
44"""
45
Tim Peters18e67782002-02-17 04:25:24 +000046import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000047from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000048
Guido van Rossum7d0a8262007-05-21 23:13:11 +000049import os, sys, io
Fred Drakea6070f02000-08-16 14:14:32 +000050
Fred Drake70d566b2003-04-29 19:50:25 +000051try:
Gregory P. Smithaafdca82010-01-04 04:50:36 +000052 import errno
Fred Drake70d566b2003-04-29 19:50:25 +000053except ImportError:
Gregory P. Smithaafdca82010-01-04 04:50:36 +000054 errno = None
55EBADF = getattr(errno, 'EBADF', 9)
56EINTR = getattr(errno, 'EINTR', 4)
Fred Drake70d566b2003-04-29 19:50:25 +000057
Benjamin Petersonef3e4c22009-04-11 19:48:14 +000058__all__ = ["getfqdn", "create_connection"]
Skip Montanaro0de65802001-02-15 22:15:14 +000059__all__.extend(os._get_exports_list(_socket))
Thomas Wouters47b49bf2007-08-30 22:15:33 +000060
61
62_realsocket = socket
Skip Montanaro0de65802001-02-15 22:15:14 +000063
Fred Drakea6070f02000-08-16 14:14:32 +000064# WSA error codes
65if sys.platform.lower().startswith("win"):
66 errorTab = {}
67 errorTab[10004] = "The operation was interrupted."
68 errorTab[10009] = "A bad file handle was passed."
69 errorTab[10013] = "Permission denied."
70 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
71 errorTab[10022] = "An invalid operation was attempted."
72 errorTab[10035] = "The socket operation would block"
73 errorTab[10036] = "A blocking operation is already in progress."
74 errorTab[10048] = "The network address is in use."
75 errorTab[10054] = "The connection has been reset."
76 errorTab[10058] = "The network has been shut down."
77 errorTab[10060] = "The operation timed out."
78 errorTab[10061] = "Connection refused."
79 errorTab[10063] = "The name is too long."
80 errorTab[10064] = "The host is down."
81 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000082 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000083
Fred Drakea6070f02000-08-16 14:14:32 +000084
Guido van Rossum7d0a8262007-05-21 23:13:11 +000085class socket(_socket.socket):
86
87 """A subclass of _socket.socket adding the makefile() method."""
88
Guido van Rossum86bc33c2007-11-14 22:32:02 +000089 __slots__ = ["__weakref__", "_io_refs", "_closed"]
Guido van Rossum7d0a8262007-05-21 23:13:11 +000090
Jeremy Hylton5accbdb2007-08-03 20:40:09 +000091 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +000092 _socket.socket.__init__(self, family, type, proto, fileno)
Guido van Rossum86bc33c2007-11-14 22:32:02 +000093 self._io_refs = 0
94 self._closed = False
Jeremy Hylton5accbdb2007-08-03 20:40:09 +000095
Guido van Rossum7d0a8262007-05-21 23:13:11 +000096 def __repr__(self):
97 """Wrap __repr__() to reveal the real class name."""
98 s = _socket.socket.__repr__(self)
99 if s.startswith("<socket object"):
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000100 s = "<%s.%s%s%s" % (self.__class__.__module__,
101 self.__class__.__name__,
102 (self._closed and " [closed] ") or "",
103 s[7:])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000104 return s
105
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000106 def dup(self):
107 """dup() -> socket object
108
109 Return a new socket object connected to the same system resource.
110 """
111 fd = dup(self.fileno())
112 sock = self.__class__(self.family, self.type, self.proto, fileno=fd)
113 sock.settimeout(self.gettimeout())
114 return sock
115
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000116 def accept(self):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000117 """accept() -> (socket object, address info)
118
119 Wait for an incoming connection. Return a new socket
120 representing the connection, and the address of the client.
121 For IP sockets, the address info is a pair (hostaddr, port).
122 """
123 fd, addr = self._accept()
124 return socket(self.family, self.type, self.proto, fileno=fd), addr
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000125
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000126 def makefile(self, mode="r", buffering=None, *,
127 encoding=None, newline=None):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000128 """makefile(...) -> an I/O stream connected to the socket
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000129
130 The arguments are as for io.open() after the filename,
131 except the only mode characters supported are 'r', 'w' and 'b'.
132 The semantics are similar too. (XXX refactor to share code?)
133 """
134 for c in mode:
135 if c not in {"r", "w", "b"}:
136 raise ValueError("invalid mode %r (only r, w, b allowed)")
137 writing = "w" in mode
138 reading = "r" in mode or not writing
139 assert reading or writing
140 binary = "b" in mode
141 rawmode = ""
142 if reading:
143 rawmode += "r"
144 if writing:
145 rawmode += "w"
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000146 raw = SocketIO(self, rawmode)
147 self._io_refs += 1
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000148 if buffering is None:
149 buffering = -1
150 if buffering < 0:
151 buffering = io.DEFAULT_BUFFER_SIZE
152 if buffering == 0:
153 if not binary:
154 raise ValueError("unbuffered streams must be binary")
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000155 return raw
156 if reading and writing:
157 buffer = io.BufferedRWPair(raw, raw, buffering)
158 elif reading:
159 buffer = io.BufferedReader(raw, buffering)
160 else:
161 assert writing
162 buffer = io.BufferedWriter(raw, buffering)
163 if binary:
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000164 return buffer
165 text = io.TextIOWrapper(buffer, encoding, newline)
Guido van Rossum93adc5d2007-07-17 20:41:19 +0000166 text.mode = mode
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000167 return text
168
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000169 def _decref_socketios(self):
170 if self._io_refs > 0:
171 self._io_refs -= 1
172 if self._closed:
173 self.close()
174
Daniel Stutzbach19d6a4f2010-08-31 20:08:07 +0000175 def _real_close(self, _ss=_socket.socket):
Benjamin Peterson49203dc2010-08-31 20:10:55 +0000176 # This function should not reference any globals. See issue #808164.
Daniel Stutzbach19d6a4f2010-08-31 20:08:07 +0000177 _ss.close(self)
Bill Janssen54cc54c2007-12-14 22:08:56 +0000178
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000179 def close(self):
Benjamin Peterson49203dc2010-08-31 20:10:55 +0000180 # This function should not reference any globals. See issue #808164.
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000181 self._closed = True
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000182 if self._io_refs <= 0:
Bill Janssen54cc54c2007-12-14 22:08:56 +0000183 self._real_close()
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000184
185def fromfd(fd, family, type, proto=0):
186 """ fromfd(fd, family, type[, proto]) -> socket object
187
188 Create a socket object from a duplicate of the given file
189 descriptor. The remaining arguments are the same as for socket().
190 """
191 nfd = dup(fd)
192 return socket(family, type, proto, nfd)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000193
194
195class SocketIO(io.RawIOBase):
196
197 """Raw I/O implementation for stream sockets.
198
199 This class supports the makefile() method on sockets. It provides
200 the raw I/O interface on top of a socket object.
201 """
202
203 # XXX More docs
204
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000205 def __init__(self, sock, mode):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000206 if mode not in ("r", "w", "rw", "rb", "wb", "rwb"):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000207 raise ValueError("invalid mode: %r" % mode)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000208 io.RawIOBase.__init__(self)
209 self._sock = sock
Benjamin Peterson44309e62008-11-22 00:41:45 +0000210 if "b" not in mode:
211 mode += "b"
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000212 self._mode = mode
Guido van Rossum5abbf752007-08-27 17:39:33 +0000213 self._reading = "r" in mode
214 self._writing = "w" in mode
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000215
216 def readinto(self, b):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000217 self._checkClosed()
218 self._checkReadable()
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000219 while True:
220 try:
221 return self._sock.recv_into(b)
222 except error as e:
223 if e.args[0] == EINTR:
224 continue
225 raise
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000226
227 def write(self, b):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000228 self._checkClosed()
229 self._checkWritable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000230 return self._sock.send(b)
231
232 def readable(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000233 return self._reading and not self.closed
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000234
235 def writable(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000236 return self._writing and not self.closed
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000237
238 def fileno(self):
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000239 self._checkClosed()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000240 return self._sock.fileno()
241
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000242 @property
243 def name(self):
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000244 return self.fileno()
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000245
246 @property
247 def mode(self):
248 return self._mode
249
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000250 def close(self):
251 if self.closed:
252 return
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000253 io.RawIOBase.close(self)
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000254 self._sock._decref_socketios()
255 self._sock = None
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000256
Fred Drakea6070f02000-08-16 14:14:32 +0000257
258def getfqdn(name=''):
259 """Get fully qualified domain name from name.
260
261 An empty argument is interpreted as meaning the local host.
262
263 First the hostname returned by gethostbyaddr() is checked, then
264 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000265 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000266 """
267 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000268 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000269 name = gethostname()
270 try:
271 hostname, aliases, ipaddrs = gethostbyaddr(name)
272 except error:
273 pass
274 else:
275 aliases.insert(0, hostname)
276 for name in aliases:
277 if '.' in name:
278 break
279 else:
280 name = hostname
281 return name
282
283
Georg Brandlf78e02b2008-06-10 17:40:04 +0000284_GLOBAL_DEFAULT_TIMEOUT = object()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000285
Gregory P. Smithb4066372010-01-03 03:28:29 +0000286def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
287 source_address=None):
Georg Brandlf78e02b2008-06-10 17:40:04 +0000288 """Connect to *address* and return the socket object.
289
290 Convenience function. Connect to *address* (a 2-tuple ``(host,
291 port)``) and return the socket object. Passing the optional
292 *timeout* parameter will set the timeout on the socket instance
293 before attempting to connect. If no *timeout* is supplied, the
294 global default timeout setting returned by :func:`getdefaulttimeout`
Gregory P. Smithb4066372010-01-03 03:28:29 +0000295 is used. If *source_address* is set it must be a tuple of (host, port)
296 for the socket to bind as a source address before making the connection.
297 An host of '' or port 0 tells the OS to use the default.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000298 """
299
Guido van Rossumd8faa362007-04-27 19:54:29 +0000300 host, port = address
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000301 err = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000302 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
303 af, socktype, proto, canonname, sa = res
304 sock = None
305 try:
306 sock = socket(af, socktype, proto)
Georg Brandlf78e02b2008-06-10 17:40:04 +0000307 if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000308 sock.settimeout(timeout)
Gregory P. Smithb4066372010-01-03 03:28:29 +0000309 if source_address:
310 sock.bind(source_address)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000311 sock.connect(sa)
312 return sock
313
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000314 except error as _:
315 err = _
Guido van Rossumd8faa362007-04-27 19:54:29 +0000316 if sock is not None:
317 sock.close()
318
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000319 if err is not None:
320 raise err
321 else:
322 raise error("getaddrinfo returns an empty list")