blob: 9133411c3128ce913c2b55779a8d1d0d57524481 [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:
52 from errno import EBADF
53except ImportError:
54 EBADF = 9
55
Benjamin Petersonef3e4c22009-04-11 19:48:14 +000056__all__ = ["getfqdn", "create_connection"]
Skip Montanaro0de65802001-02-15 22:15:14 +000057__all__.extend(os._get_exports_list(_socket))
Thomas Wouters47b49bf2007-08-30 22:15:33 +000058
59
60_realsocket = socket
Skip Montanaro0de65802001-02-15 22:15:14 +000061
Fred Drakea6070f02000-08-16 14:14:32 +000062# WSA error codes
63if sys.platform.lower().startswith("win"):
64 errorTab = {}
65 errorTab[10004] = "The operation was interrupted."
66 errorTab[10009] = "A bad file handle was passed."
67 errorTab[10013] = "Permission denied."
68 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
69 errorTab[10022] = "An invalid operation was attempted."
70 errorTab[10035] = "The socket operation would block"
71 errorTab[10036] = "A blocking operation is already in progress."
72 errorTab[10048] = "The network address is in use."
73 errorTab[10054] = "The connection has been reset."
74 errorTab[10058] = "The network has been shut down."
75 errorTab[10060] = "The operation timed out."
76 errorTab[10061] = "Connection refused."
77 errorTab[10063] = "The name is too long."
78 errorTab[10064] = "The host is down."
79 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +000080 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +000081
Fred Drakea6070f02000-08-16 14:14:32 +000082
Guido van Rossum7d0a8262007-05-21 23:13:11 +000083class socket(_socket.socket):
84
85 """A subclass of _socket.socket adding the makefile() method."""
86
Guido van Rossum86bc33c2007-11-14 22:32:02 +000087 __slots__ = ["__weakref__", "_io_refs", "_closed"]
Guido van Rossum7d0a8262007-05-21 23:13:11 +000088
Jeremy Hylton5accbdb2007-08-03 20:40:09 +000089 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +000090 _socket.socket.__init__(self, family, type, proto, fileno)
Guido van Rossum86bc33c2007-11-14 22:32:02 +000091 self._io_refs = 0
92 self._closed = False
Jeremy Hylton5accbdb2007-08-03 20:40:09 +000093
Guido van Rossum7d0a8262007-05-21 23:13:11 +000094 def __repr__(self):
95 """Wrap __repr__() to reveal the real class name."""
96 s = _socket.socket.__repr__(self)
97 if s.startswith("<socket object"):
Guido van Rossum86bc33c2007-11-14 22:32:02 +000098 s = "<%s.%s%s%s" % (self.__class__.__module__,
99 self.__class__.__name__,
100 (self._closed and " [closed] ") or "",
101 s[7:])
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000102 return s
103
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000104 def dup(self):
105 """dup() -> socket object
106
107 Return a new socket object connected to the same system resource.
108 """
109 fd = dup(self.fileno())
110 sock = self.__class__(self.family, self.type, self.proto, fileno=fd)
111 sock.settimeout(self.gettimeout())
112 return sock
113
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000114 def accept(self):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000115 """accept() -> (socket object, address info)
116
117 Wait for an incoming connection. Return a new socket
118 representing the connection, and the address of the client.
119 For IP sockets, the address info is a pair (hostaddr, port).
120 """
121 fd, addr = self._accept()
122 return socket(self.family, self.type, self.proto, fileno=fd), addr
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000123
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000124 def makefile(self, mode="r", buffering=None, *,
125 encoding=None, newline=None):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000126 """makefile(...) -> an I/O stream connected to the socket
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000127
128 The arguments are as for io.open() after the filename,
129 except the only mode characters supported are 'r', 'w' and 'b'.
130 The semantics are similar too. (XXX refactor to share code?)
131 """
132 for c in mode:
133 if c not in {"r", "w", "b"}:
134 raise ValueError("invalid mode %r (only r, w, b allowed)")
135 writing = "w" in mode
136 reading = "r" in mode or not writing
137 assert reading or writing
138 binary = "b" in mode
139 rawmode = ""
140 if reading:
141 rawmode += "r"
142 if writing:
143 rawmode += "w"
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000144 raw = SocketIO(self, rawmode)
145 self._io_refs += 1
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000146 if buffering is None:
147 buffering = -1
148 if buffering < 0:
149 buffering = io.DEFAULT_BUFFER_SIZE
150 if buffering == 0:
151 if not binary:
152 raise ValueError("unbuffered streams must be binary")
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000153 return raw
154 if reading and writing:
155 buffer = io.BufferedRWPair(raw, raw, buffering)
156 elif reading:
157 buffer = io.BufferedReader(raw, buffering)
158 else:
159 assert writing
160 buffer = io.BufferedWriter(raw, buffering)
161 if binary:
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000162 return buffer
163 text = io.TextIOWrapper(buffer, encoding, newline)
Guido van Rossum93adc5d2007-07-17 20:41:19 +0000164 text.mode = mode
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000165 return text
166
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000167 def _decref_socketios(self):
168 if self._io_refs > 0:
169 self._io_refs -= 1
170 if self._closed:
171 self.close()
172
Bill Janssen54cc54c2007-12-14 22:08:56 +0000173 def _real_close(self):
174 _socket.socket.close(self)
175
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000176 def close(self):
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000177 self._closed = True
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000178 if self._io_refs <= 0:
Bill Janssen54cc54c2007-12-14 22:08:56 +0000179 self._real_close()
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000180
181def fromfd(fd, family, type, proto=0):
182 """ fromfd(fd, family, type[, proto]) -> socket object
183
184 Create a socket object from a duplicate of the given file
185 descriptor. The remaining arguments are the same as for socket().
186 """
187 nfd = dup(fd)
188 return socket(family, type, proto, nfd)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000189
190
191class SocketIO(io.RawIOBase):
192
193 """Raw I/O implementation for stream sockets.
194
195 This class supports the makefile() method on sockets. It provides
196 the raw I/O interface on top of a socket object.
197 """
198
199 # XXX More docs
200
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000201 def __init__(self, sock, mode):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000202 if mode not in ("r", "w", "rw", "rb", "wb", "rwb"):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000203 raise ValueError("invalid mode: %r" % mode)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000204 io.RawIOBase.__init__(self)
205 self._sock = sock
Benjamin Peterson44309e62008-11-22 00:41:45 +0000206 if "b" not in mode:
207 mode += "b"
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000208 self._mode = mode
Guido van Rossum5abbf752007-08-27 17:39:33 +0000209 self._reading = "r" in mode
210 self._writing = "w" in mode
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000211
212 def readinto(self, b):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000213 self._checkClosed()
214 self._checkReadable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000215 return self._sock.recv_into(b)
216
217 def write(self, b):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000218 self._checkClosed()
219 self._checkWritable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000220 return self._sock.send(b)
221
222 def readable(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000223 return self._reading and not self.closed
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000224
225 def writable(self):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000226 return self._writing and not self.closed
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000227
228 def fileno(self):
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000229 self._checkClosed()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000230 return self._sock.fileno()
231
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000232 @property
233 def name(self):
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000234 return self.fileno()
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000235
236 @property
237 def mode(self):
238 return self._mode
239
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000240 def close(self):
241 if self.closed:
242 return
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000243 io.RawIOBase.close(self)
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000244 self._sock._decref_socketios()
245 self._sock = None
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000246
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000247 def __del__(self):
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000248 if not self.closed:
249 self._sock._decref_socketios()
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000250
Fred Drakea6070f02000-08-16 14:14:32 +0000251
252def getfqdn(name=''):
253 """Get fully qualified domain name from name.
254
255 An empty argument is interpreted as meaning the local host.
256
257 First the hostname returned by gethostbyaddr() is checked, then
258 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000259 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000260 """
261 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000262 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000263 name = gethostname()
264 try:
265 hostname, aliases, ipaddrs = gethostbyaddr(name)
266 except error:
267 pass
268 else:
269 aliases.insert(0, hostname)
270 for name in aliases:
271 if '.' in name:
272 break
273 else:
274 name = hostname
275 return name
276
277
Georg Brandlf78e02b2008-06-10 17:40:04 +0000278_GLOBAL_DEFAULT_TIMEOUT = object()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000279
Gregory P. Smithb4066372010-01-03 03:28:29 +0000280def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
281 source_address=None):
Georg Brandlf78e02b2008-06-10 17:40:04 +0000282 """Connect to *address* and return the socket object.
283
284 Convenience function. Connect to *address* (a 2-tuple ``(host,
285 port)``) and return the socket object. Passing the optional
286 *timeout* parameter will set the timeout on the socket instance
287 before attempting to connect. If no *timeout* is supplied, the
288 global default timeout setting returned by :func:`getdefaulttimeout`
Gregory P. Smithb4066372010-01-03 03:28:29 +0000289 is used. If *source_address* is set it must be a tuple of (host, port)
290 for the socket to bind as a source address before making the connection.
291 An host of '' or port 0 tells the OS to use the default.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000292 """
293
294 msg = "getaddrinfo returns an empty list"
295 host, port = address
296 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
297 af, socktype, proto, canonname, sa = res
298 sock = None
299 try:
300 sock = socket(af, socktype, proto)
Georg Brandlf78e02b2008-06-10 17:40:04 +0000301 if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000302 sock.settimeout(timeout)
Gregory P. Smithb4066372010-01-03 03:28:29 +0000303 if source_address:
304 sock.bind(source_address)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000305 sock.connect(sa)
306 return sock
307
308 except error as err:
309 msg = err
310 if sock is not None:
311 sock.close()
312
313 raise error(msg)