blob: 3016b03104d45f6ff3ce646e5eb401b9a4f7748c [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 [*]
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +000015fromshare() -- create a socket object from data received from socket.share() [*]
Fred Drakea6070f02000-08-16 14:14:32 +000016gethostname() -- return the current hostname
17gethostbyname() -- map a hostname to its IP number
18gethostbyaddr() -- map an IP number or hostname to DNS info
19getservbyname() -- map a service name and a protocol name to a port number
Mark Dickinson5c91bf32009-06-02 07:41:26 +000020getprotobyname() -- map a protocol name (e.g. 'tcp') to a number
Fred Drakea6070f02000-08-16 14:14:32 +000021ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
22htons(), htonl() -- convert 16, 32 bit int from host to network byte order
23inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
24inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
Guido van Rossum9d0c8ce2002-07-18 17:08:35 +000025socket.getdefaulttimeout() -- get the default timeout value
26socket.setdefaulttimeout() -- set the default timeout value
Gregory P. Smithb4066372010-01-03 03:28:29 +000027create_connection() -- connects to an address, with an optional timeout and
28 optional source address.
Fred Drakea6070f02000-08-16 14:14:32 +000029
30 [*] not available on all platforms!
31
32Special objects:
33
34SocketType -- type object for socket objects
35error -- exception raised for I/O errors
Guido van Rossum47dfa4a2003-04-25 05:48:32 +000036has_ipv6 -- boolean value indicating if IPv6 is supported
Fred Drakea6070f02000-08-16 14:14:32 +000037
Ethan Furman7184bac2014-10-14 18:56:53 -070038IntEnum constants:
Fred Drakea6070f02000-08-16 14:14:32 +000039
40AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
41SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
42
Ethan Furman7184bac2014-10-14 18:56:53 -070043Integer constants:
44
Fred Drakea6070f02000-08-16 14:14:32 +000045Many other constants may be defined; these may be used in calls to
46the setsockopt() and getsockopt() methods.
47"""
48
Tim Peters18e67782002-02-17 04:25:24 +000049import _socket
Fred Drakea6070f02000-08-16 14:14:32 +000050from _socket import *
Tim Peters18e67782002-02-17 04:25:24 +000051
Giampaolo Rodola'915d1412014-06-11 03:54:30 +020052import os, sys, io, selectors
Ethan Furman40bed8a2016-09-11 13:34:42 -070053from enum import IntEnum, IntFlag
Fred Drakea6070f02000-08-16 14:14:32 +000054
Fred Drake70d566b2003-04-29 19:50:25 +000055try:
Gregory P. Smithaafdca82010-01-04 04:50:36 +000056 import errno
Brett Cannoncd171c82013-07-04 17:43:24 -040057except ImportError:
Gregory P. Smithaafdca82010-01-04 04:50:36 +000058 errno = None
59EBADF = getattr(errno, 'EBADF', 9)
Antoine Pitrou98b46702010-09-18 22:59:00 +000060EAGAIN = getattr(errno, 'EAGAIN', 11)
61EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11)
Fred Drake70d566b2003-04-29 19:50:25 +000062
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +020063__all__ = ["fromfd", "getfqdn", "create_connection", "create_server",
64 "has_dualstack_ipv6", "AddressFamily", "SocketKind"]
Skip Montanaro0de65802001-02-15 22:15:14 +000065__all__.extend(os._get_exports_list(_socket))
Thomas Wouters47b49bf2007-08-30 22:15:33 +000066
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -070067# Set up the socket.AF_* socket.SOCK_* constants as members of IntEnums for
68# nicer string representations.
69# Note that _socket only knows about the integer values. The public interface
70# in this module understands the enums and translates them back from integers
71# where needed (e.g. .family property of a socket object).
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -070072
orlnub1230fb9fad2018-09-12 20:28:53 +030073IntEnum._convert_(
Ethan Furman24e837f2015-03-18 17:27:57 -070074 'AddressFamily',
75 __name__,
76 lambda C: C.isupper() and C.startswith('AF_'))
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -070077
orlnub1230fb9fad2018-09-12 20:28:53 +030078IntEnum._convert_(
Ethan Furman24e837f2015-03-18 17:27:57 -070079 'SocketKind',
80 __name__,
81 lambda C: C.isupper() and C.startswith('SOCK_'))
Charles-François Natali98c745a2014-10-14 21:22:44 +010082
orlnub1230fb9fad2018-09-12 20:28:53 +030083IntFlag._convert_(
Ethan Furman40bed8a2016-09-11 13:34:42 -070084 'MsgFlag',
85 __name__,
86 lambda C: C.isupper() and C.startswith('MSG_'))
87
orlnub1230fb9fad2018-09-12 20:28:53 +030088IntFlag._convert_(
Ethan Furman40bed8a2016-09-11 13:34:42 -070089 'AddressInfo',
90 __name__,
91 lambda C: C.isupper() and C.startswith('AI_'))
92
Charles-François Natali98c745a2014-10-14 21:22:44 +010093_LOCALHOST = '127.0.0.1'
94_LOCALHOST_V6 = '::1'
95
96
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -070097def _intenum_converter(value, enum_klass):
98 """Convert a numeric family value to an IntEnum member.
99
100 If it's not a known member, return the numeric value itself.
101 """
102 try:
103 return enum_klass(value)
104 except ValueError:
105 return value
Thomas Wouters47b49bf2007-08-30 22:15:33 +0000106
Fred Drakea6070f02000-08-16 14:14:32 +0000107# WSA error codes
108if sys.platform.lower().startswith("win"):
109 errorTab = {}
110 errorTab[10004] = "The operation was interrupted."
111 errorTab[10009] = "A bad file handle was passed."
112 errorTab[10013] = "Permission denied."
113 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
114 errorTab[10022] = "An invalid operation was attempted."
115 errorTab[10035] = "The socket operation would block"
116 errorTab[10036] = "A blocking operation is already in progress."
117 errorTab[10048] = "The network address is in use."
118 errorTab[10054] = "The connection has been reset."
119 errorTab[10058] = "The network has been shut down."
120 errorTab[10060] = "The operation timed out."
121 errorTab[10061] = "Connection refused."
122 errorTab[10063] = "The name is too long."
123 errorTab[10064] = "The host is down."
124 errorTab[10065] = "The host is unreachable."
Skip Montanaro64de1a42001-03-18 19:53:21 +0000125 __all__.append("errorTab")
Guido van Rossumde7cade2002-08-08 15:25:28 +0000126
Fred Drakea6070f02000-08-16 14:14:32 +0000127
Giampaolo Rodola'915d1412014-06-11 03:54:30 +0200128class _GiveupOnSendfile(Exception): pass
129
130
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000131class socket(_socket.socket):
132
133 """A subclass of _socket.socket adding the makefile() method."""
134
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000135 __slots__ = ["__weakref__", "_io_refs", "_closed"]
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000136
Christian Heimesb6e43af2018-01-29 22:37:58 +0100137 def __init__(self, family=-1, type=-1, proto=-1, fileno=None):
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700138 # For user code address family and type values are IntEnum members, but
139 # for the underlying _socket.socket they're just integers. The
140 # constructor of _socket.socket converts the given argument to an
141 # integer automatically.
Christian Heimesb6e43af2018-01-29 22:37:58 +0100142 if fileno is None:
143 if family == -1:
144 family = AF_INET
145 if type == -1:
146 type = SOCK_STREAM
147 if proto == -1:
148 proto = 0
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000149 _socket.socket.__init__(self, family, type, proto, fileno)
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000150 self._io_refs = 0
151 self._closed = False
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000152
Giampaolo Rodolàb383dbb2010-09-08 22:44:12 +0000153 def __enter__(self):
154 return self
155
156 def __exit__(self, *args):
157 if not self._closed:
158 self.close()
159
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000160 def __repr__(self):
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200161 """Wrap __repr__() to reveal the real class name and socket
162 address(es).
163 """
164 closed = getattr(self, '_closed', False)
Giampaolo Rodola'b6281492013-10-03 21:01:43 +0200165 s = "<%s.%s%s fd=%i, family=%s, type=%s, proto=%i" \
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200166 % (self.__class__.__module__,
Serhiy Storchaka521e5862014-07-22 15:00:37 +0300167 self.__class__.__qualname__,
Giampaolo Rodola'50331cb2013-04-10 15:49:47 +0200168 " [closed]" if closed else "",
169 self.fileno(),
170 self.family,
171 self.type,
172 self.proto)
173 if not closed:
174 try:
175 laddr = self.getsockname()
176 if laddr:
177 s += ", laddr=%s" % str(laddr)
178 except error:
179 pass
180 try:
181 raddr = self.getpeername()
182 if raddr:
183 s += ", raddr=%s" % str(raddr)
184 except error:
185 pass
186 s += '>'
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000187 return s
188
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100189 def __getstate__(self):
Serhiy Storchaka0353b4e2018-10-31 02:28:07 +0200190 raise TypeError(f"cannot pickle {self.__class__.__name__!r} object")
Antoine Pitrou6d58d642011-03-20 23:56:36 +0100191
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000192 def dup(self):
193 """dup() -> socket object
194
Victor Stinnerdaf45552013-08-28 00:53:59 +0200195 Duplicate the socket. Return a new socket object connected to the same
196 system resource. The new socket is non-inheritable.
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000197 """
198 fd = dup(self.fileno())
199 sock = self.__class__(self.family, self.type, self.proto, fileno=fd)
200 sock.settimeout(self.gettimeout())
201 return sock
202
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000203 def accept(self):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000204 """accept() -> (socket object, address info)
205
206 Wait for an incoming connection. Return a new socket
207 representing the connection, and the address of the client.
208 For IP sockets, the address info is a pair (hostaddr, port).
209 """
210 fd, addr = self._accept()
Yury Selivanov98181422017-12-18 20:02:54 -0500211 sock = socket(self.family, self.type, self.proto, fileno=fd)
Antoine Pitrou600232b2011-01-05 21:03:42 +0000212 # Issue #7995: if no default timeout is set and the listening
213 # socket had a (non-zero) timeout, force the new socket in blocking
214 # mode to override platform-specific socket flags inheritance.
215 if getdefaulttimeout() is None and self.gettimeout():
216 sock.setblocking(True)
217 return sock, addr
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000218
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000219 def makefile(self, mode="r", buffering=None, *,
Antoine Pitrou834bd812010-10-13 16:17:14 +0000220 encoding=None, errors=None, newline=None):
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000221 """makefile(...) -> an I/O stream connected to the socket
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000222
Berker Peksag3fe64d02016-02-18 17:34:00 +0200223 The arguments are as for io.open() after the filename, except the only
224 supported mode values are 'r' (default), 'w' and 'b'.
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000225 """
Berker Peksag3fe64d02016-02-18 17:34:00 +0200226 # XXX refactor to share code?
Serhiy Storchakafca2fc02014-11-19 12:33:40 +0200227 if not set(mode) <= {"r", "w", "b"}:
228 raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,))
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000229 writing = "w" in mode
230 reading = "r" in mode or not writing
231 assert reading or writing
232 binary = "b" in mode
233 rawmode = ""
234 if reading:
235 rawmode += "r"
236 if writing:
237 rawmode += "w"
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000238 raw = SocketIO(self, rawmode)
239 self._io_refs += 1
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000240 if buffering is None:
241 buffering = -1
242 if buffering < 0:
243 buffering = io.DEFAULT_BUFFER_SIZE
244 if buffering == 0:
245 if not binary:
246 raise ValueError("unbuffered streams must be binary")
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000247 return raw
248 if reading and writing:
249 buffer = io.BufferedRWPair(raw, raw, buffering)
250 elif reading:
251 buffer = io.BufferedReader(raw, buffering)
252 else:
253 assert writing
254 buffer = io.BufferedWriter(raw, buffering)
255 if binary:
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000256 return buffer
Antoine Pitrou834bd812010-10-13 16:17:14 +0000257 text = io.TextIOWrapper(buffer, encoding, errors, newline)
Guido van Rossum93adc5d2007-07-17 20:41:19 +0000258 text.mode = mode
Guido van Rossum7d0a8262007-05-21 23:13:11 +0000259 return text
260
Giampaolo Rodola'915d1412014-06-11 03:54:30 +0200261 if hasattr(os, 'sendfile'):
262
263 def _sendfile_use_sendfile(self, file, offset=0, count=None):
264 self._check_sendfile_params(file, offset, count)
265 sockno = self.fileno()
266 try:
267 fileno = file.fileno()
268 except (AttributeError, io.UnsupportedOperation) as err:
269 raise _GiveupOnSendfile(err) # not a regular file
270 try:
271 fsize = os.fstat(fileno).st_size
Berker Peksagbcfb35f2016-09-17 23:22:06 +0300272 except OSError as err:
Giampaolo Rodola'915d1412014-06-11 03:54:30 +0200273 raise _GiveupOnSendfile(err) # not a regular file
274 if not fsize:
275 return 0 # empty file
276 blocksize = fsize if not count else count
277
278 timeout = self.gettimeout()
279 if timeout == 0:
280 raise ValueError("non-blocking sockets are not supported")
281 # poll/select have the advantage of not requiring any
282 # extra file descriptor, contrarily to epoll/kqueue
283 # (also, they require a single syscall).
284 if hasattr(selectors, 'PollSelector'):
285 selector = selectors.PollSelector()
286 else:
287 selector = selectors.SelectSelector()
288 selector.register(sockno, selectors.EVENT_WRITE)
289
290 total_sent = 0
291 # localize variable access to minimize overhead
292 selector_select = selector.select
293 os_sendfile = os.sendfile
294 try:
295 while True:
296 if timeout and not selector_select(timeout):
297 raise _socket.timeout('timed out')
298 if count:
299 blocksize = count - total_sent
300 if blocksize <= 0:
301 break
302 try:
303 sent = os_sendfile(sockno, fileno, offset, blocksize)
304 except BlockingIOError:
305 if not timeout:
306 # Block until the socket is ready to send some
307 # data; avoids hogging CPU resources.
308 selector_select()
309 continue
310 except OSError as err:
311 if total_sent == 0:
312 # We can get here for different reasons, the main
313 # one being 'file' is not a regular mmap(2)-like
314 # file, in which case we'll fall back on using
315 # plain send().
316 raise _GiveupOnSendfile(err)
317 raise err from None
318 else:
319 if sent == 0:
320 break # EOF
321 offset += sent
322 total_sent += sent
323 return total_sent
324 finally:
325 if total_sent > 0 and hasattr(file, 'seek'):
326 file.seek(offset)
327 else:
328 def _sendfile_use_sendfile(self, file, offset=0, count=None):
329 raise _GiveupOnSendfile(
330 "os.sendfile() not available on this platform")
331
332 def _sendfile_use_send(self, file, offset=0, count=None):
333 self._check_sendfile_params(file, offset, count)
334 if self.gettimeout() == 0:
335 raise ValueError("non-blocking sockets are not supported")
336 if offset:
337 file.seek(offset)
338 blocksize = min(count, 8192) if count else 8192
339 total_sent = 0
340 # localize variable access to minimize overhead
341 file_read = file.read
342 sock_send = self.send
343 try:
344 while True:
345 if count:
346 blocksize = min(count - total_sent, blocksize)
347 if blocksize <= 0:
348 break
349 data = memoryview(file_read(blocksize))
350 if not data:
351 break # EOF
352 while True:
353 try:
354 sent = sock_send(data)
355 except BlockingIOError:
356 continue
357 else:
358 total_sent += sent
359 if sent < len(data):
360 data = data[sent:]
361 else:
362 break
363 return total_sent
364 finally:
365 if total_sent > 0 and hasattr(file, 'seek'):
366 file.seek(offset + total_sent)
367
368 def _check_sendfile_params(self, file, offset, count):
369 if 'b' not in getattr(file, 'mode', 'b'):
370 raise ValueError("file should be opened in binary mode")
371 if not self.type & SOCK_STREAM:
372 raise ValueError("only SOCK_STREAM type sockets are supported")
373 if count is not None:
374 if not isinstance(count, int):
375 raise TypeError(
376 "count must be a positive integer (got {!r})".format(count))
377 if count <= 0:
378 raise ValueError(
379 "count must be a positive integer (got {!r})".format(count))
380
381 def sendfile(self, file, offset=0, count=None):
382 """sendfile(file[, offset[, count]]) -> sent
383
384 Send a file until EOF is reached by using high-performance
385 os.sendfile() and return the total number of bytes which
386 were sent.
387 *file* must be a regular file object opened in binary mode.
388 If os.sendfile() is not available (e.g. Windows) or file is
389 not a regular file socket.send() will be used instead.
390 *offset* tells from where to start reading the file.
391 If specified, *count* is the total number of bytes to transmit
392 as opposed to sending the file until EOF is reached.
393 File position is updated on return or also in case of error in
394 which case file.tell() can be used to figure out the number of
395 bytes which were sent.
396 The socket must be of SOCK_STREAM type.
397 Non-blocking sockets are not supported.
398 """
399 try:
400 return self._sendfile_use_sendfile(file, offset, count)
401 except _GiveupOnSendfile:
402 return self._sendfile_use_send(file, offset, count)
403
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000404 def _decref_socketios(self):
405 if self._io_refs > 0:
406 self._io_refs -= 1
407 if self._closed:
408 self.close()
409
Daniel Stutzbach19d6a4f2010-08-31 20:08:07 +0000410 def _real_close(self, _ss=_socket.socket):
Benjamin Peterson49203dc2010-08-31 20:10:55 +0000411 # This function should not reference any globals. See issue #808164.
Daniel Stutzbach19d6a4f2010-08-31 20:08:07 +0000412 _ss.close(self)
Bill Janssen54cc54c2007-12-14 22:08:56 +0000413
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000414 def close(self):
Benjamin Peterson49203dc2010-08-31 20:10:55 +0000415 # This function should not reference any globals. See issue #808164.
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000416 self._closed = True
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000417 if self._io_refs <= 0:
Bill Janssen54cc54c2007-12-14 22:08:56 +0000418 self._real_close()
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000419
Antoine Pitrou70deb3d2012-04-01 01:00:17 +0200420 def detach(self):
421 """detach() -> file descriptor
422
423 Close the socket object without closing the underlying file descriptor.
424 The object cannot be used after this call, but the file descriptor
425 can be reused for other purposes. The file descriptor is returned.
426 """
427 self._closed = True
428 return super().detach()
429
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700430 @property
431 def family(self):
432 """Read-only access to the address family for this socket.
433 """
434 return _intenum_converter(super().family, AddressFamily)
435
436 @property
437 def type(self):
438 """Read-only access to the socket type.
439 """
Ethan Furman7184bac2014-10-14 18:56:53 -0700440 return _intenum_converter(super().type, SocketKind)
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700441
Victor Stinnerdaf45552013-08-28 00:53:59 +0200442 if os.name == 'nt':
443 def get_inheritable(self):
444 return os.get_handle_inheritable(self.fileno())
445 def set_inheritable(self, inheritable):
446 os.set_handle_inheritable(self.fileno(), inheritable)
447 else:
448 def get_inheritable(self):
449 return os.get_inheritable(self.fileno())
450 def set_inheritable(self, inheritable):
451 os.set_inheritable(self.fileno(), inheritable)
452 get_inheritable.__doc__ = "Get the inheritable flag of the socket"
453 set_inheritable.__doc__ = "Set the inheritable flag of the socket"
454
Guido van Rossum39eb8fa2007-11-16 01:24:05 +0000455def fromfd(fd, family, type, proto=0):
456 """ fromfd(fd, family, type[, proto]) -> socket object
457
458 Create a socket object from a duplicate of the given file
459 descriptor. The remaining arguments are the same as for socket().
460 """
461 nfd = dup(fd)
462 return socket(family, type, proto, nfd)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000463
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +0000464if hasattr(_socket.socket, "share"):
465 def fromshare(info):
466 """ fromshare(info) -> socket object
467
Benjamin Peterson82f34ad2015-01-13 09:17:24 -0500468 Create a socket object from the bytes object returned by
Kristján Valur Jónsson10f383a2012-04-07 11:23:31 +0000469 socket.share(pid).
470 """
471 return socket(0, 0, 0, info)
Ethan Furman8e120ac2014-10-18 15:10:49 -0700472 __all__.append("fromshare")
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000473
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000474if hasattr(_socket, "socketpair"):
475
476 def socketpair(family=None, type=SOCK_STREAM, proto=0):
477 """socketpair([family[, type[, proto]]]) -> (socket object, socket object)
478
479 Create a pair of socket objects from the sockets returned by the platform
480 socketpair() function.
481 The arguments are the same as for socket() except the default family is
482 AF_UNIX if defined on the platform; otherwise, the default is AF_INET.
483 """
484 if family is None:
485 try:
486 family = AF_UNIX
487 except NameError:
488 family = AF_INET
489 a, b = _socket.socketpair(family, type, proto)
490 a = socket(family, type, proto, a.detach())
491 b = socket(family, type, proto, b.detach())
492 return a, b
493
Charles-François Natali98c745a2014-10-14 21:22:44 +0100494else:
495
496 # Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain.
497 def socketpair(family=AF_INET, type=SOCK_STREAM, proto=0):
498 if family == AF_INET:
499 host = _LOCALHOST
500 elif family == AF_INET6:
501 host = _LOCALHOST_V6
502 else:
503 raise ValueError("Only AF_INET and AF_INET6 socket address families "
504 "are supported")
505 if type != SOCK_STREAM:
506 raise ValueError("Only SOCK_STREAM socket type is supported")
507 if proto != 0:
508 raise ValueError("Only protocol zero is supported")
509
510 # We create a connected TCP socket. Note the trick with
511 # setblocking(False) that prevents us from having to create a thread.
512 lsock = socket(family, type, proto)
513 try:
514 lsock.bind((host, 0))
515 lsock.listen()
516 # On IPv6, ignore flow_info and scope_id
517 addr, port = lsock.getsockname()[:2]
518 csock = socket(family, type, proto)
519 try:
520 csock.setblocking(False)
521 try:
522 csock.connect((addr, port))
523 except (BlockingIOError, InterruptedError):
524 pass
525 csock.setblocking(True)
526 ssock, _ = lsock.accept()
527 except:
528 csock.close()
529 raise
530 finally:
531 lsock.close()
532 return (ssock, csock)
Victor Stinner3da57432016-08-17 14:40:08 +0200533 __all__.append("socketpair")
Charles-François Natali98c745a2014-10-14 21:22:44 +0100534
535socketpair.__doc__ = """socketpair([family[, type[, proto]]]) -> (socket object, socket object)
536Create a pair of socket objects from the sockets returned by the platform
537socketpair() function.
538The arguments are the same as for socket() except the default family is AF_UNIX
539if defined on the platform; otherwise, the default is AF_INET.
540"""
Antoine Pitrou9e0b8642010-09-14 18:00:02 +0000541
Antoine Pitrou98b46702010-09-18 22:59:00 +0000542_blocking_errnos = { EAGAIN, EWOULDBLOCK }
543
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000544class SocketIO(io.RawIOBase):
545
546 """Raw I/O implementation for stream sockets.
547
548 This class supports the makefile() method on sockets. It provides
549 the raw I/O interface on top of a socket object.
550 """
551
Antoine Pitrou872b79d2010-09-15 08:39:25 +0000552 # One might wonder why not let FileIO do the job instead. There are two
553 # main reasons why FileIO is not adapted:
554 # - it wouldn't work under Windows (where you can't used read() and
555 # write() on a socket handle)
556 # - it wouldn't work with socket timeouts (FileIO would ignore the
557 # timeout and consider the socket non-blocking)
558
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000559 # XXX More docs
560
Guido van Rossum86bc33c2007-11-14 22:32:02 +0000561 def __init__(self, sock, mode):
Benjamin Peterson44309e62008-11-22 00:41:45 +0000562 if mode not in ("r", "w", "rw", "rb", "wb", "rwb"):
Guido van Rossum5abbf752007-08-27 17:39:33 +0000563 raise ValueError("invalid mode: %r" % mode)
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000564 io.RawIOBase.__init__(self)
565 self._sock = sock
Benjamin Peterson44309e62008-11-22 00:41:45 +0000566 if "b" not in mode:
567 mode += "b"
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000568 self._mode = mode
Guido van Rossum5abbf752007-08-27 17:39:33 +0000569 self._reading = "r" in mode
570 self._writing = "w" in mode
Antoine Pitrou68e5c042011-02-25 23:07:44 +0000571 self._timeout_occurred = False
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000572
573 def readinto(self, b):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000574 """Read up to len(b) bytes into the writable buffer *b* and return
575 the number of bytes read. If the socket is non-blocking and no bytes
576 are available, None is returned.
577
578 If *b* is non-empty, a 0 return value indicates that the connection
579 was shutdown at the other end.
580 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000581 self._checkClosed()
582 self._checkReadable()
Antoine Pitrou68e5c042011-02-25 23:07:44 +0000583 if self._timeout_occurred:
Andrew Svetlovf7a17b42012-12-25 16:47:37 +0200584 raise OSError("cannot read from timed out object")
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000585 while True:
586 try:
587 return self._sock.recv_into(b)
Antoine Pitrou68e5c042011-02-25 23:07:44 +0000588 except timeout:
589 self._timeout_occurred = True
590 raise
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000591 except error as e:
Antoine Pitrou24d659d2011-10-23 23:49:42 +0200592 if e.args[0] in _blocking_errnos:
Antoine Pitrou98b46702010-09-18 22:59:00 +0000593 return None
Gregory P. Smithaafdca82010-01-04 04:50:36 +0000594 raise
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000595
596 def write(self, b):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000597 """Write the given bytes or bytearray object *b* to the socket
598 and return the number of bytes written. This can be less than
599 len(b) if not all data could be written. If the socket is
600 non-blocking and no bytes could be written None is returned.
601 """
Guido van Rossum5abbf752007-08-27 17:39:33 +0000602 self._checkClosed()
603 self._checkWritable()
Antoine Pitrou98b46702010-09-18 22:59:00 +0000604 try:
605 return self._sock.send(b)
606 except error as e:
607 # XXX what about EINTR?
608 if e.args[0] in _blocking_errnos:
609 return None
610 raise
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000611
612 def readable(self):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000613 """True if the SocketIO is open for reading.
614 """
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +0200615 if self.closed:
616 raise ValueError("I/O operation on closed socket.")
617 return self._reading
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000618
619 def writable(self):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000620 """True if the SocketIO is open for writing.
621 """
Antoine Pitrou1e7ee9d2012-09-14 17:28:10 +0200622 if self.closed:
623 raise ValueError("I/O operation on closed socket.")
624 return self._writing
625
626 def seekable(self):
627 """True if the SocketIO is open for seeking.
628 """
629 if self.closed:
630 raise ValueError("I/O operation on closed socket.")
631 return super().seekable()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000632
633 def fileno(self):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000634 """Return the file descriptor of the underlying socket.
635 """
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000636 self._checkClosed()
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000637 return self._sock.fileno()
638
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000639 @property
640 def name(self):
Victor Stinnerc3a51ec2011-01-04 11:00:45 +0000641 if not self.closed:
642 return self.fileno()
643 else:
644 return -1
Amaury Forgeot d'Arc9d24ff02008-11-20 23:15:52 +0000645
646 @property
647 def mode(self):
648 return self._mode
649
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000650 def close(self):
Antoine Pitrou5aa0d102010-09-15 09:32:45 +0000651 """Close the SocketIO object. This doesn't close the underlying
652 socket, except if all references to it have disappeared.
653 """
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000654 if self.closed:
655 return
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000656 io.RawIOBase.close(self)
Gregory P. Smithde3369f2009-01-12 04:50:11 +0000657 self._sock._decref_socketios()
658 self._sock = None
Jeremy Hylton5accbdb2007-08-03 20:40:09 +0000659
Fred Drakea6070f02000-08-16 14:14:32 +0000660
661def getfqdn(name=''):
662 """Get fully qualified domain name from name.
663
664 An empty argument is interpreted as meaning the local host.
665
666 First the hostname returned by gethostbyaddr() is checked, then
667 possibly existing aliases. In case no FQDN is available, hostname
Brett Cannon01668a12005-03-11 00:04:17 +0000668 from gethostname() is returned.
Fred Drakea6070f02000-08-16 14:14:32 +0000669 """
670 name = name.strip()
Peter Schneider-Kamp2d2785a2000-08-16 20:30:21 +0000671 if not name or name == '0.0.0.0':
Fred Drakea6070f02000-08-16 14:14:32 +0000672 name = gethostname()
673 try:
674 hostname, aliases, ipaddrs = gethostbyaddr(name)
675 except error:
676 pass
677 else:
678 aliases.insert(0, hostname)
679 for name in aliases:
680 if '.' in name:
681 break
682 else:
683 name = hostname
684 return name
685
686
Georg Brandlf78e02b2008-06-10 17:40:04 +0000687_GLOBAL_DEFAULT_TIMEOUT = object()
Guido van Rossumd8faa362007-04-27 19:54:29 +0000688
Gregory P. Smithb4066372010-01-03 03:28:29 +0000689def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
690 source_address=None):
Georg Brandlf78e02b2008-06-10 17:40:04 +0000691 """Connect to *address* and return the socket object.
692
693 Convenience function. Connect to *address* (a 2-tuple ``(host,
694 port)``) and return the socket object. Passing the optional
695 *timeout* parameter will set the timeout on the socket instance
696 before attempting to connect. If no *timeout* is supplied, the
697 global default timeout setting returned by :func:`getdefaulttimeout`
Gregory P. Smithb4066372010-01-03 03:28:29 +0000698 is used. If *source_address* is set it must be a tuple of (host, port)
699 for the socket to bind as a source address before making the connection.
Serhiy Storchaka6a7b3a72016-04-17 08:32:47 +0300700 A host of '' or port 0 tells the OS to use the default.
Guido van Rossumd8faa362007-04-27 19:54:29 +0000701 """
702
Guido van Rossumd8faa362007-04-27 19:54:29 +0000703 host, port = address
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000704 err = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000705 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
706 af, socktype, proto, canonname, sa = res
707 sock = None
708 try:
709 sock = socket(af, socktype, proto)
Georg Brandlf78e02b2008-06-10 17:40:04 +0000710 if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
Guido van Rossumd8faa362007-04-27 19:54:29 +0000711 sock.settimeout(timeout)
Gregory P. Smithb4066372010-01-03 03:28:29 +0000712 if source_address:
713 sock.bind(source_address)
Guido van Rossumd8faa362007-04-27 19:54:29 +0000714 sock.connect(sa)
Victor Stinneracb9fa72017-09-13 10:10:10 -0700715 # Break explicitly a reference cycle
716 err = None
Guido van Rossumd8faa362007-04-27 19:54:29 +0000717 return sock
718
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000719 except error as _:
720 err = _
Guido van Rossumd8faa362007-04-27 19:54:29 +0000721 if sock is not None:
722 sock.close()
723
Antoine Pitrou4b92b5f2010-09-07 21:05:49 +0000724 if err is not None:
725 raise err
726 else:
727 raise error("getaddrinfo returns an empty list")
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700728
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +0200729
730def has_dualstack_ipv6():
731 """Return True if the platform supports creating a SOCK_STREAM socket
732 which can handle both AF_INET and AF_INET6 (IPv4 / IPv6) connections.
733 """
734 if not has_ipv6 \
735 or not hasattr(_socket, 'IPPROTO_IPV6') \
736 or not hasattr(_socket, 'IPV6_V6ONLY'):
737 return False
738 try:
739 with socket(AF_INET6, SOCK_STREAM) as sock:
740 sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 0)
741 return True
742 except error:
743 return False
744
745
Giampaolo Rodola8702b672019-04-09 04:42:06 +0200746def create_server(address, *, family=AF_INET, backlog=None, reuse_port=False,
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +0200747 dualstack_ipv6=False):
748 """Convenience function which creates a SOCK_STREAM type socket
749 bound to *address* (a 2-tuple (host, port)) and return the socket
750 object.
751
752 *family* should be either AF_INET or AF_INET6.
753 *backlog* is the queue size passed to socket.listen().
754 *reuse_port* dictates whether to use the SO_REUSEPORT socket option.
755 *dualstack_ipv6*: if true and the platform supports it, it will
756 create an AF_INET6 socket able to accept both IPv4 or IPv6
757 connections. When false it will explicitly disable this option on
758 platforms that enable it by default (e.g. Linux).
759
760 >>> with create_server((None, 8000)) as server:
761 ... while True:
762 ... conn, addr = server.accept()
763 ... # handle new connection
764 """
765 if reuse_port and not hasattr(_socket, "SO_REUSEPORT"):
766 raise ValueError("SO_REUSEPORT not supported on this platform")
767 if dualstack_ipv6:
768 if not has_dualstack_ipv6():
769 raise ValueError("dualstack_ipv6 not supported on this platform")
770 if family != AF_INET6:
771 raise ValueError("dualstack_ipv6 requires AF_INET6 family")
772 sock = socket(family, SOCK_STREAM)
773 try:
774 # Note about Windows. We don't set SO_REUSEADDR because:
775 # 1) It's unnecessary: bind() will succeed even in case of a
776 # previous closed socket on the same address and still in
777 # TIME_WAIT state.
778 # 2) If set, another socket is free to bind() on the same
779 # address, effectively preventing this one from accepting
780 # connections. Also, it may set the process in a state where
781 # it'll no longer respond to any signals or graceful kills.
782 # See: msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx
783 if os.name not in ('nt', 'cygwin') and \
784 hasattr(_socket, 'SO_REUSEADDR'):
785 try:
786 sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
787 except error:
788 # Fail later on bind(), for platforms which may not
789 # support this option.
790 pass
791 if reuse_port:
792 sock.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
793 if has_ipv6 and family == AF_INET6:
794 if dualstack_ipv6:
795 sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 0)
796 elif hasattr(_socket, "IPV6_V6ONLY") and \
797 hasattr(_socket, "IPPROTO_IPV6"):
798 sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 1)
799 try:
800 sock.bind(address)
801 except error as err:
802 msg = '%s (while attempting to bind on address %r)' % \
803 (err.strerror, address)
804 raise error(err.errno, msg) from None
Giampaolo Rodola8702b672019-04-09 04:42:06 +0200805 if backlog is None:
806 sock.listen()
807 else:
808 sock.listen(backlog)
Giampaolo Rodolaeb7e29f2019-04-09 00:34:02 +0200809 return sock
810 except error:
811 sock.close()
812 raise
813
814
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700815def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
816 """Resolve host and port into list of address info entries.
817
818 Translate the host/port argument into a sequence of 5-tuples that contain
819 all the necessary arguments for creating a socket connected to that service.
820 host is a domain name, a string representation of an IPv4/v6 address or
821 None. port is a string service name such as 'http', a numeric port number or
822 None. By passing None as the value of host and port, you can pass NULL to
823 the underlying C API.
824
825 The family, type and proto arguments can be optionally specified in order to
826 narrow the list of addresses returned. Passing zero as a value for each of
827 these arguments selects the full range of results.
828 """
829 # We override this function since we want to translate the numeric family
830 # and socket type values to enum constants.
831 addrlist = []
832 for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
833 af, socktype, proto, canonname, sa = res
834 addrlist.append((_intenum_converter(af, AddressFamily),
Ethan Furman7184bac2014-10-14 18:56:53 -0700835 _intenum_converter(socktype, SocketKind),
Eli Benderskyb2ff3cf2013-08-31 15:13:30 -0700836 proto, canonname, sa))
837 return addrlist