blob: cafa573a30c0525522cf0377c35cbd83cba0fed1 [file] [log] [blame]
Olivier Deprezf4ef2d02021-04-20 13:36:24 +02001# 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.
7On other systems, it only supports IP. Functions specific for a
8socket are available as methods of the socket object.
9
10Functions:
11
12socket() -- create a new socket object
13socketpair() -- create a pair of new socket objects [*]
14fromfd() -- create a socket object from an open file descriptor [*]
15send_fds() -- Send file descriptor to the socket.
16recv_fds() -- Recieve file descriptors from the socket.
17fromshare() -- create a socket object from data received from socket.share() [*]
18gethostname() -- return the current hostname
19gethostbyname() -- map a hostname to its IP number
20gethostbyaddr() -- map an IP number or hostname to DNS info
21getservbyname() -- map a service name and a protocol name to a port number
22getprotobyname() -- map a protocol name (e.g. 'tcp') to a number
23ntohs(), ntohl() -- convert 16, 32 bit int from network to host byte order
24htons(), htonl() -- convert 16, 32 bit int from host to network byte order
25inet_aton() -- convert IP addr string (123.45.67.89) to 32-bit packed format
26inet_ntoa() -- convert 32-bit packed format IP to string (123.45.67.89)
27socket.getdefaulttimeout() -- get the default timeout value
28socket.setdefaulttimeout() -- set the default timeout value
29create_connection() -- connects to an address, with an optional timeout and
30 optional source address.
31
32 [*] not available on all platforms!
33
34Special objects:
35
36SocketType -- type object for socket objects
37error -- exception raised for I/O errors
38has_ipv6 -- boolean value indicating if IPv6 is supported
39
40IntEnum constants:
41
42AF_INET, AF_UNIX -- socket domains (first argument to socket() call)
43SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument)
44
45Integer constants:
46
47Many other constants may be defined; these may be used in calls to
48the setsockopt() and getsockopt() methods.
49"""
50
51import _socket
52from _socket import *
53
54import os, sys, io, selectors
55from enum import IntEnum, IntFlag
56
57try:
58 import errno
59except ImportError:
60 errno = None
61EBADF = getattr(errno, 'EBADF', 9)
62EAGAIN = getattr(errno, 'EAGAIN', 11)
63EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11)
64
65__all__ = ["fromfd", "getfqdn", "create_connection", "create_server",
66 "has_dualstack_ipv6", "AddressFamily", "SocketKind"]
67__all__.extend(os._get_exports_list(_socket))
68
69# Set up the socket.AF_* socket.SOCK_* constants as members of IntEnums for
70# nicer string representations.
71# Note that _socket only knows about the integer values. The public interface
72# in this module understands the enums and translates them back from integers
73# where needed (e.g. .family property of a socket object).
74
75IntEnum._convert_(
76 'AddressFamily',
77 __name__,
78 lambda C: C.isupper() and C.startswith('AF_'))
79
80IntEnum._convert_(
81 'SocketKind',
82 __name__,
83 lambda C: C.isupper() and C.startswith('SOCK_'))
84
85IntFlag._convert_(
86 'MsgFlag',
87 __name__,
88 lambda C: C.isupper() and C.startswith('MSG_'))
89
90IntFlag._convert_(
91 'AddressInfo',
92 __name__,
93 lambda C: C.isupper() and C.startswith('AI_'))
94
95_LOCALHOST = '127.0.0.1'
96_LOCALHOST_V6 = '::1'
97
98
99def _intenum_converter(value, enum_klass):
100 """Convert a numeric family value to an IntEnum member.
101
102 If it's not a known member, return the numeric value itself.
103 """
104 try:
105 return enum_klass(value)
106 except ValueError:
107 return value
108
109
110# WSA error codes
111if sys.platform.lower().startswith("win"):
112 errorTab = {}
113 errorTab[6] = "Specified event object handle is invalid."
114 errorTab[8] = "Insufficient memory available."
115 errorTab[87] = "One or more parameters are invalid."
116 errorTab[995] = "Overlapped operation aborted."
117 errorTab[996] = "Overlapped I/O event object not in signaled state."
118 errorTab[997] = "Overlapped operation will complete later."
119 errorTab[10004] = "The operation was interrupted."
120 errorTab[10009] = "A bad file handle was passed."
121 errorTab[10013] = "Permission denied."
122 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT
123 errorTab[10022] = "An invalid operation was attempted."
124 errorTab[10024] = "Too many open files."
125 errorTab[10035] = "The socket operation would block"
126 errorTab[10036] = "A blocking operation is already in progress."
127 errorTab[10037] = "Operation already in progress."
128 errorTab[10038] = "Socket operation on nonsocket."
129 errorTab[10039] = "Destination address required."
130 errorTab[10040] = "Message too long."
131 errorTab[10041] = "Protocol wrong type for socket."
132 errorTab[10042] = "Bad protocol option."
133 errorTab[10043] = "Protocol not supported."
134 errorTab[10044] = "Socket type not supported."
135 errorTab[10045] = "Operation not supported."
136 errorTab[10046] = "Protocol family not supported."
137 errorTab[10047] = "Address family not supported by protocol family."
138 errorTab[10048] = "The network address is in use."
139 errorTab[10049] = "Cannot assign requested address."
140 errorTab[10050] = "Network is down."
141 errorTab[10051] = "Network is unreachable."
142 errorTab[10052] = "Network dropped connection on reset."
143 errorTab[10053] = "Software caused connection abort."
144 errorTab[10054] = "The connection has been reset."
145 errorTab[10055] = "No buffer space available."
146 errorTab[10056] = "Socket is already connected."
147 errorTab[10057] = "Socket is not connected."
148 errorTab[10058] = "The network has been shut down."
149 errorTab[10059] = "Too many references."
150 errorTab[10060] = "The operation timed out."
151 errorTab[10061] = "Connection refused."
152 errorTab[10062] = "Cannot translate name."
153 errorTab[10063] = "The name is too long."
154 errorTab[10064] = "The host is down."
155 errorTab[10065] = "The host is unreachable."
156 errorTab[10066] = "Directory not empty."
157 errorTab[10067] = "Too many processes."
158 errorTab[10068] = "User quota exceeded."
159 errorTab[10069] = "Disk quota exceeded."
160 errorTab[10070] = "Stale file handle reference."
161 errorTab[10071] = "Item is remote."
162 errorTab[10091] = "Network subsystem is unavailable."
163 errorTab[10092] = "Winsock.dll version out of range."
164 errorTab[10093] = "Successful WSAStartup not yet performed."
165 errorTab[10101] = "Graceful shutdown in progress."
166 errorTab[10102] = "No more results from WSALookupServiceNext."
167 errorTab[10103] = "Call has been canceled."
168 errorTab[10104] = "Procedure call table is invalid."
169 errorTab[10105] = "Service provider is invalid."
170 errorTab[10106] = "Service provider failed to initialize."
171 errorTab[10107] = "System call failure."
172 errorTab[10108] = "Service not found."
173 errorTab[10109] = "Class type not found."
174 errorTab[10110] = "No more results from WSALookupServiceNext."
175 errorTab[10111] = "Call was canceled."
176 errorTab[10112] = "Database query was refused."
177 errorTab[11001] = "Host not found."
178 errorTab[11002] = "Nonauthoritative host not found."
179 errorTab[11003] = "This is a nonrecoverable error."
180 errorTab[11004] = "Valid name, no data record requested type."
181 errorTab[11005] = "QoS receivers."
182 errorTab[11006] = "QoS senders."
183 errorTab[11007] = "No QoS senders."
184 errorTab[11008] = "QoS no receivers."
185 errorTab[11009] = "QoS request confirmed."
186 errorTab[11010] = "QoS admission error."
187 errorTab[11011] = "QoS policy failure."
188 errorTab[11012] = "QoS bad style."
189 errorTab[11013] = "QoS bad object."
190 errorTab[11014] = "QoS traffic control error."
191 errorTab[11015] = "QoS generic error."
192 errorTab[11016] = "QoS service type error."
193 errorTab[11017] = "QoS flowspec error."
194 errorTab[11018] = "Invalid QoS provider buffer."
195 errorTab[11019] = "Invalid QoS filter style."
196 errorTab[11020] = "Invalid QoS filter style."
197 errorTab[11021] = "Incorrect QoS filter count."
198 errorTab[11022] = "Invalid QoS object length."
199 errorTab[11023] = "Incorrect QoS flow count."
200 errorTab[11024] = "Unrecognized QoS object."
201 errorTab[11025] = "Invalid QoS policy object."
202 errorTab[11026] = "Invalid QoS flow descriptor."
203 errorTab[11027] = "Invalid QoS provider-specific flowspec."
204 errorTab[11028] = "Invalid QoS provider-specific filterspec."
205 errorTab[11029] = "Invalid QoS shape discard mode object."
206 errorTab[11030] = "Invalid QoS shaping rate object."
207 errorTab[11031] = "Reserved policy QoS element type."
208 __all__.append("errorTab")
209
210
211class _GiveupOnSendfile(Exception): pass
212
213
214class socket(_socket.socket):
215
216 """A subclass of _socket.socket adding the makefile() method."""
217
218 __slots__ = ["__weakref__", "_io_refs", "_closed"]
219
220 def __init__(self, family=-1, type=-1, proto=-1, fileno=None):
221 # For user code address family and type values are IntEnum members, but
222 # for the underlying _socket.socket they're just integers. The
223 # constructor of _socket.socket converts the given argument to an
224 # integer automatically.
225 if fileno is None:
226 if family == -1:
227 family = AF_INET
228 if type == -1:
229 type = SOCK_STREAM
230 if proto == -1:
231 proto = 0
232 _socket.socket.__init__(self, family, type, proto, fileno)
233 self._io_refs = 0
234 self._closed = False
235
236 def __enter__(self):
237 return self
238
239 def __exit__(self, *args):
240 if not self._closed:
241 self.close()
242
243 def __repr__(self):
244 """Wrap __repr__() to reveal the real class name and socket
245 address(es).
246 """
247 closed = getattr(self, '_closed', False)
248 s = "<%s.%s%s fd=%i, family=%s, type=%s, proto=%i" \
249 % (self.__class__.__module__,
250 self.__class__.__qualname__,
251 " [closed]" if closed else "",
252 self.fileno(),
253 self.family,
254 self.type,
255 self.proto)
256 if not closed:
257 try:
258 laddr = self.getsockname()
259 if laddr:
260 s += ", laddr=%s" % str(laddr)
261 except error:
262 pass
263 try:
264 raddr = self.getpeername()
265 if raddr:
266 s += ", raddr=%s" % str(raddr)
267 except error:
268 pass
269 s += '>'
270 return s
271
272 def __getstate__(self):
273 raise TypeError(f"cannot pickle {self.__class__.__name__!r} object")
274
275 def dup(self):
276 """dup() -> socket object
277
278 Duplicate the socket. Return a new socket object connected to the same
279 system resource. The new socket is non-inheritable.
280 """
281 fd = dup(self.fileno())
282 sock = self.__class__(self.family, self.type, self.proto, fileno=fd)
283 sock.settimeout(self.gettimeout())
284 return sock
285
286 def accept(self):
287 """accept() -> (socket object, address info)
288
289 Wait for an incoming connection. Return a new socket
290 representing the connection, and the address of the client.
291 For IP sockets, the address info is a pair (hostaddr, port).
292 """
293 fd, addr = self._accept()
294 sock = socket(self.family, self.type, self.proto, fileno=fd)
295 # Issue #7995: if no default timeout is set and the listening
296 # socket had a (non-zero) timeout, force the new socket in blocking
297 # mode to override platform-specific socket flags inheritance.
298 if getdefaulttimeout() is None and self.gettimeout():
299 sock.setblocking(True)
300 return sock, addr
301
302 def makefile(self, mode="r", buffering=None, *,
303 encoding=None, errors=None, newline=None):
304 """makefile(...) -> an I/O stream connected to the socket
305
306 The arguments are as for io.open() after the filename, except the only
307 supported mode values are 'r' (default), 'w' and 'b'.
308 """
309 # XXX refactor to share code?
310 if not set(mode) <= {"r", "w", "b"}:
311 raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,))
312 writing = "w" in mode
313 reading = "r" in mode or not writing
314 assert reading or writing
315 binary = "b" in mode
316 rawmode = ""
317 if reading:
318 rawmode += "r"
319 if writing:
320 rawmode += "w"
321 raw = SocketIO(self, rawmode)
322 self._io_refs += 1
323 if buffering is None:
324 buffering = -1
325 if buffering < 0:
326 buffering = io.DEFAULT_BUFFER_SIZE
327 if buffering == 0:
328 if not binary:
329 raise ValueError("unbuffered streams must be binary")
330 return raw
331 if reading and writing:
332 buffer = io.BufferedRWPair(raw, raw, buffering)
333 elif reading:
334 buffer = io.BufferedReader(raw, buffering)
335 else:
336 assert writing
337 buffer = io.BufferedWriter(raw, buffering)
338 if binary:
339 return buffer
340 text = io.TextIOWrapper(buffer, encoding, errors, newline)
341 text.mode = mode
342 return text
343
344 if hasattr(os, 'sendfile'):
345
346 def _sendfile_use_sendfile(self, file, offset=0, count=None):
347 self._check_sendfile_params(file, offset, count)
348 sockno = self.fileno()
349 try:
350 fileno = file.fileno()
351 except (AttributeError, io.UnsupportedOperation) as err:
352 raise _GiveupOnSendfile(err) # not a regular file
353 try:
354 fsize = os.fstat(fileno).st_size
355 except OSError as err:
356 raise _GiveupOnSendfile(err) # not a regular file
357 if not fsize:
358 return 0 # empty file
359 # Truncate to 1GiB to avoid OverflowError, see bpo-38319.
360 blocksize = min(count or fsize, 2 ** 30)
361 timeout = self.gettimeout()
362 if timeout == 0:
363 raise ValueError("non-blocking sockets are not supported")
364 # poll/select have the advantage of not requiring any
365 # extra file descriptor, contrarily to epoll/kqueue
366 # (also, they require a single syscall).
367 if hasattr(selectors, 'PollSelector'):
368 selector = selectors.PollSelector()
369 else:
370 selector = selectors.SelectSelector()
371 selector.register(sockno, selectors.EVENT_WRITE)
372
373 total_sent = 0
374 # localize variable access to minimize overhead
375 selector_select = selector.select
376 os_sendfile = os.sendfile
377 try:
378 while True:
379 if timeout and not selector_select(timeout):
380 raise _socket.timeout('timed out')
381 if count:
382 blocksize = count - total_sent
383 if blocksize <= 0:
384 break
385 try:
386 sent = os_sendfile(sockno, fileno, offset, blocksize)
387 except BlockingIOError:
388 if not timeout:
389 # Block until the socket is ready to send some
390 # data; avoids hogging CPU resources.
391 selector_select()
392 continue
393 except OSError as err:
394 if total_sent == 0:
395 # We can get here for different reasons, the main
396 # one being 'file' is not a regular mmap(2)-like
397 # file, in which case we'll fall back on using
398 # plain send().
399 raise _GiveupOnSendfile(err)
400 raise err from None
401 else:
402 if sent == 0:
403 break # EOF
404 offset += sent
405 total_sent += sent
406 return total_sent
407 finally:
408 if total_sent > 0 and hasattr(file, 'seek'):
409 file.seek(offset)
410 else:
411 def _sendfile_use_sendfile(self, file, offset=0, count=None):
412 raise _GiveupOnSendfile(
413 "os.sendfile() not available on this platform")
414
415 def _sendfile_use_send(self, file, offset=0, count=None):
416 self._check_sendfile_params(file, offset, count)
417 if self.gettimeout() == 0:
418 raise ValueError("non-blocking sockets are not supported")
419 if offset:
420 file.seek(offset)
421 blocksize = min(count, 8192) if count else 8192
422 total_sent = 0
423 # localize variable access to minimize overhead
424 file_read = file.read
425 sock_send = self.send
426 try:
427 while True:
428 if count:
429 blocksize = min(count - total_sent, blocksize)
430 if blocksize <= 0:
431 break
432 data = memoryview(file_read(blocksize))
433 if not data:
434 break # EOF
435 while True:
436 try:
437 sent = sock_send(data)
438 except BlockingIOError:
439 continue
440 else:
441 total_sent += sent
442 if sent < len(data):
443 data = data[sent:]
444 else:
445 break
446 return total_sent
447 finally:
448 if total_sent > 0 and hasattr(file, 'seek'):
449 file.seek(offset + total_sent)
450
451 def _check_sendfile_params(self, file, offset, count):
452 if 'b' not in getattr(file, 'mode', 'b'):
453 raise ValueError("file should be opened in binary mode")
454 if not self.type & SOCK_STREAM:
455 raise ValueError("only SOCK_STREAM type sockets are supported")
456 if count is not None:
457 if not isinstance(count, int):
458 raise TypeError(
459 "count must be a positive integer (got {!r})".format(count))
460 if count <= 0:
461 raise ValueError(
462 "count must be a positive integer (got {!r})".format(count))
463
464 def sendfile(self, file, offset=0, count=None):
465 """sendfile(file[, offset[, count]]) -> sent
466
467 Send a file until EOF is reached by using high-performance
468 os.sendfile() and return the total number of bytes which
469 were sent.
470 *file* must be a regular file object opened in binary mode.
471 If os.sendfile() is not available (e.g. Windows) or file is
472 not a regular file socket.send() will be used instead.
473 *offset* tells from where to start reading the file.
474 If specified, *count* is the total number of bytes to transmit
475 as opposed to sending the file until EOF is reached.
476 File position is updated on return or also in case of error in
477 which case file.tell() can be used to figure out the number of
478 bytes which were sent.
479 The socket must be of SOCK_STREAM type.
480 Non-blocking sockets are not supported.
481 """
482 try:
483 return self._sendfile_use_sendfile(file, offset, count)
484 except _GiveupOnSendfile:
485 return self._sendfile_use_send(file, offset, count)
486
487 def _decref_socketios(self):
488 if self._io_refs > 0:
489 self._io_refs -= 1
490 if self._closed:
491 self.close()
492
493 def _real_close(self, _ss=_socket.socket):
494 # This function should not reference any globals. See issue #808164.
495 _ss.close(self)
496
497 def close(self):
498 # This function should not reference any globals. See issue #808164.
499 self._closed = True
500 if self._io_refs <= 0:
501 self._real_close()
502
503 def detach(self):
504 """detach() -> file descriptor
505
506 Close the socket object without closing the underlying file descriptor.
507 The object cannot be used after this call, but the file descriptor
508 can be reused for other purposes. The file descriptor is returned.
509 """
510 self._closed = True
511 return super().detach()
512
513 @property
514 def family(self):
515 """Read-only access to the address family for this socket.
516 """
517 return _intenum_converter(super().family, AddressFamily)
518
519 @property
520 def type(self):
521 """Read-only access to the socket type.
522 """
523 return _intenum_converter(super().type, SocketKind)
524
525 if os.name == 'nt':
526 def get_inheritable(self):
527 return os.get_handle_inheritable(self.fileno())
528 def set_inheritable(self, inheritable):
529 os.set_handle_inheritable(self.fileno(), inheritable)
530 else:
531 def get_inheritable(self):
532 return os.get_inheritable(self.fileno())
533 def set_inheritable(self, inheritable):
534 os.set_inheritable(self.fileno(), inheritable)
535 get_inheritable.__doc__ = "Get the inheritable flag of the socket"
536 set_inheritable.__doc__ = "Set the inheritable flag of the socket"
537
538def fromfd(fd, family, type, proto=0):
539 """ fromfd(fd, family, type[, proto]) -> socket object
540
541 Create a socket object from a duplicate of the given file
542 descriptor. The remaining arguments are the same as for socket().
543 """
544 nfd = dup(fd)
545 return socket(family, type, proto, nfd)
546
547if hasattr(_socket.socket, "sendmsg"):
548 import array
549
550 def send_fds(sock, buffers, fds, flags=0, address=None):
551 """ send_fds(sock, buffers, fds[, flags[, address]]) -> integer
552
553 Send the list of file descriptors fds over an AF_UNIX socket.
554 """
555 return sock.sendmsg(buffers, [(_socket.SOL_SOCKET,
556 _socket.SCM_RIGHTS, array.array("i", fds))])
557 __all__.append("send_fds")
558
559if hasattr(_socket.socket, "recvmsg"):
560 import array
561
562 def recv_fds(sock, bufsize, maxfds, flags=0):
563 """ recv_fds(sock, bufsize, maxfds[, flags]) -> (data, list of file
564 descriptors, msg_flags, address)
565
566 Receive up to maxfds file descriptors returning the message
567 data and a list containing the descriptors.
568 """
569 # Array of ints
570 fds = array.array("i")
571 msg, ancdata, flags, addr = sock.recvmsg(bufsize,
572 _socket.CMSG_LEN(maxfds * fds.itemsize))
573 for cmsg_level, cmsg_type, cmsg_data in ancdata:
574 if (cmsg_level == _socket.SOL_SOCKET and cmsg_type == _socket.SCM_RIGHTS):
575 fds.frombytes(cmsg_data[:
576 len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
577
578 return msg, list(fds), flags, addr
579 __all__.append("recv_fds")
580
581if hasattr(_socket.socket, "share"):
582 def fromshare(info):
583 """ fromshare(info) -> socket object
584
585 Create a socket object from the bytes object returned by
586 socket.share(pid).
587 """
588 return socket(0, 0, 0, info)
589 __all__.append("fromshare")
590
591if hasattr(_socket, "socketpair"):
592
593 def socketpair(family=None, type=SOCK_STREAM, proto=0):
594 """socketpair([family[, type[, proto]]]) -> (socket object, socket object)
595
596 Create a pair of socket objects from the sockets returned by the platform
597 socketpair() function.
598 The arguments are the same as for socket() except the default family is
599 AF_UNIX if defined on the platform; otherwise, the default is AF_INET.
600 """
601 if family is None:
602 try:
603 family = AF_UNIX
604 except NameError:
605 family = AF_INET
606 a, b = _socket.socketpair(family, type, proto)
607 a = socket(family, type, proto, a.detach())
608 b = socket(family, type, proto, b.detach())
609 return a, b
610
611else:
612
613 # Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain.
614 def socketpair(family=AF_INET, type=SOCK_STREAM, proto=0):
615 if family == AF_INET:
616 host = _LOCALHOST
617 elif family == AF_INET6:
618 host = _LOCALHOST_V6
619 else:
620 raise ValueError("Only AF_INET and AF_INET6 socket address families "
621 "are supported")
622 if type != SOCK_STREAM:
623 raise ValueError("Only SOCK_STREAM socket type is supported")
624 if proto != 0:
625 raise ValueError("Only protocol zero is supported")
626
627 # We create a connected TCP socket. Note the trick with
628 # setblocking(False) that prevents us from having to create a thread.
629 lsock = socket(family, type, proto)
630 try:
631 lsock.bind((host, 0))
632 lsock.listen()
633 # On IPv6, ignore flow_info and scope_id
634 addr, port = lsock.getsockname()[:2]
635 csock = socket(family, type, proto)
636 try:
637 csock.setblocking(False)
638 try:
639 csock.connect((addr, port))
640 except (BlockingIOError, InterruptedError):
641 pass
642 csock.setblocking(True)
643 ssock, _ = lsock.accept()
644 except:
645 csock.close()
646 raise
647 finally:
648 lsock.close()
649 return (ssock, csock)
650 __all__.append("socketpair")
651
652socketpair.__doc__ = """socketpair([family[, type[, proto]]]) -> (socket object, socket object)
653Create a pair of socket objects from the sockets returned by the platform
654socketpair() function.
655The arguments are the same as for socket() except the default family is AF_UNIX
656if defined on the platform; otherwise, the default is AF_INET.
657"""
658
659_blocking_errnos = { EAGAIN, EWOULDBLOCK }
660
661class SocketIO(io.RawIOBase):
662
663 """Raw I/O implementation for stream sockets.
664
665 This class supports the makefile() method on sockets. It provides
666 the raw I/O interface on top of a socket object.
667 """
668
669 # One might wonder why not let FileIO do the job instead. There are two
670 # main reasons why FileIO is not adapted:
671 # - it wouldn't work under Windows (where you can't used read() and
672 # write() on a socket handle)
673 # - it wouldn't work with socket timeouts (FileIO would ignore the
674 # timeout and consider the socket non-blocking)
675
676 # XXX More docs
677
678 def __init__(self, sock, mode):
679 if mode not in ("r", "w", "rw", "rb", "wb", "rwb"):
680 raise ValueError("invalid mode: %r" % mode)
681 io.RawIOBase.__init__(self)
682 self._sock = sock
683 if "b" not in mode:
684 mode += "b"
685 self._mode = mode
686 self._reading = "r" in mode
687 self._writing = "w" in mode
688 self._timeout_occurred = False
689
690 def readinto(self, b):
691 """Read up to len(b) bytes into the writable buffer *b* and return
692 the number of bytes read. If the socket is non-blocking and no bytes
693 are available, None is returned.
694
695 If *b* is non-empty, a 0 return value indicates that the connection
696 was shutdown at the other end.
697 """
698 self._checkClosed()
699 self._checkReadable()
700 if self._timeout_occurred:
701 raise OSError("cannot read from timed out object")
702 while True:
703 try:
704 return self._sock.recv_into(b)
705 except timeout:
706 self._timeout_occurred = True
707 raise
708 except error as e:
709 if e.args[0] in _blocking_errnos:
710 return None
711 raise
712
713 def write(self, b):
714 """Write the given bytes or bytearray object *b* to the socket
715 and return the number of bytes written. This can be less than
716 len(b) if not all data could be written. If the socket is
717 non-blocking and no bytes could be written None is returned.
718 """
719 self._checkClosed()
720 self._checkWritable()
721 try:
722 return self._sock.send(b)
723 except error as e:
724 # XXX what about EINTR?
725 if e.args[0] in _blocking_errnos:
726 return None
727 raise
728
729 def readable(self):
730 """True if the SocketIO is open for reading.
731 """
732 if self.closed:
733 raise ValueError("I/O operation on closed socket.")
734 return self._reading
735
736 def writable(self):
737 """True if the SocketIO is open for writing.
738 """
739 if self.closed:
740 raise ValueError("I/O operation on closed socket.")
741 return self._writing
742
743 def seekable(self):
744 """True if the SocketIO is open for seeking.
745 """
746 if self.closed:
747 raise ValueError("I/O operation on closed socket.")
748 return super().seekable()
749
750 def fileno(self):
751 """Return the file descriptor of the underlying socket.
752 """
753 self._checkClosed()
754 return self._sock.fileno()
755
756 @property
757 def name(self):
758 if not self.closed:
759 return self.fileno()
760 else:
761 return -1
762
763 @property
764 def mode(self):
765 return self._mode
766
767 def close(self):
768 """Close the SocketIO object. This doesn't close the underlying
769 socket, except if all references to it have disappeared.
770 """
771 if self.closed:
772 return
773 io.RawIOBase.close(self)
774 self._sock._decref_socketios()
775 self._sock = None
776
777
778def getfqdn(name=''):
779 """Get fully qualified domain name from name.
780
781 An empty argument is interpreted as meaning the local host.
782
783 First the hostname returned by gethostbyaddr() is checked, then
784 possibly existing aliases. In case no FQDN is available, hostname
785 from gethostname() is returned.
786 """
787 name = name.strip()
788 if not name or name == '0.0.0.0':
789 name = gethostname()
790 try:
791 hostname, aliases, ipaddrs = gethostbyaddr(name)
792 except error:
793 pass
794 else:
795 aliases.insert(0, hostname)
796 for name in aliases:
797 if '.' in name:
798 break
799 else:
800 name = hostname
801 return name
802
803
804_GLOBAL_DEFAULT_TIMEOUT = object()
805
806def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT,
807 source_address=None):
808 """Connect to *address* and return the socket object.
809
810 Convenience function. Connect to *address* (a 2-tuple ``(host,
811 port)``) and return the socket object. Passing the optional
812 *timeout* parameter will set the timeout on the socket instance
813 before attempting to connect. If no *timeout* is supplied, the
814 global default timeout setting returned by :func:`getdefaulttimeout`
815 is used. If *source_address* is set it must be a tuple of (host, port)
816 for the socket to bind as a source address before making the connection.
817 A host of '' or port 0 tells the OS to use the default.
818 """
819
820 host, port = address
821 err = None
822 for res in getaddrinfo(host, port, 0, SOCK_STREAM):
823 af, socktype, proto, canonname, sa = res
824 sock = None
825 try:
826 sock = socket(af, socktype, proto)
827 if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
828 sock.settimeout(timeout)
829 if source_address:
830 sock.bind(source_address)
831 sock.connect(sa)
832 # Break explicitly a reference cycle
833 err = None
834 return sock
835
836 except error as _:
837 err = _
838 if sock is not None:
839 sock.close()
840
841 if err is not None:
842 try:
843 raise err
844 finally:
845 # Break explicitly a reference cycle
846 err = None
847 else:
848 raise error("getaddrinfo returns an empty list")
849
850
851def has_dualstack_ipv6():
852 """Return True if the platform supports creating a SOCK_STREAM socket
853 which can handle both AF_INET and AF_INET6 (IPv4 / IPv6) connections.
854 """
855 if not has_ipv6 \
856 or not hasattr(_socket, 'IPPROTO_IPV6') \
857 or not hasattr(_socket, 'IPV6_V6ONLY'):
858 return False
859 try:
860 with socket(AF_INET6, SOCK_STREAM) as sock:
861 sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 0)
862 return True
863 except error:
864 return False
865
866
867def create_server(address, *, family=AF_INET, backlog=None, reuse_port=False,
868 dualstack_ipv6=False):
869 """Convenience function which creates a SOCK_STREAM type socket
870 bound to *address* (a 2-tuple (host, port)) and return the socket
871 object.
872
873 *family* should be either AF_INET or AF_INET6.
874 *backlog* is the queue size passed to socket.listen().
875 *reuse_port* dictates whether to use the SO_REUSEPORT socket option.
876 *dualstack_ipv6*: if true and the platform supports it, it will
877 create an AF_INET6 socket able to accept both IPv4 or IPv6
878 connections. When false it will explicitly disable this option on
879 platforms that enable it by default (e.g. Linux).
880
881 >>> with create_server(('', 8000)) as server:
882 ... while True:
883 ... conn, addr = server.accept()
884 ... # handle new connection
885 """
886 if reuse_port and not hasattr(_socket, "SO_REUSEPORT"):
887 raise ValueError("SO_REUSEPORT not supported on this platform")
888 if dualstack_ipv6:
889 if not has_dualstack_ipv6():
890 raise ValueError("dualstack_ipv6 not supported on this platform")
891 if family != AF_INET6:
892 raise ValueError("dualstack_ipv6 requires AF_INET6 family")
893 sock = socket(family, SOCK_STREAM)
894 try:
895 # Note about Windows. We don't set SO_REUSEADDR because:
896 # 1) It's unnecessary: bind() will succeed even in case of a
897 # previous closed socket on the same address and still in
898 # TIME_WAIT state.
899 # 2) If set, another socket is free to bind() on the same
900 # address, effectively preventing this one from accepting
901 # connections. Also, it may set the process in a state where
902 # it'll no longer respond to any signals or graceful kills.
903 # See: msdn2.microsoft.com/en-us/library/ms740621(VS.85).aspx
904 if os.name not in ('nt', 'cygwin') and \
905 hasattr(_socket, 'SO_REUSEADDR'):
906 try:
907 sock.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
908 except error:
909 # Fail later on bind(), for platforms which may not
910 # support this option.
911 pass
912 if reuse_port:
913 sock.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1)
914 if has_ipv6 and family == AF_INET6:
915 if dualstack_ipv6:
916 sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 0)
917 elif hasattr(_socket, "IPV6_V6ONLY") and \
918 hasattr(_socket, "IPPROTO_IPV6"):
919 sock.setsockopt(IPPROTO_IPV6, IPV6_V6ONLY, 1)
920 try:
921 sock.bind(address)
922 except error as err:
923 msg = '%s (while attempting to bind on address %r)' % \
924 (err.strerror, address)
925 raise error(err.errno, msg) from None
926 if backlog is None:
927 sock.listen()
928 else:
929 sock.listen(backlog)
930 return sock
931 except error:
932 sock.close()
933 raise
934
935
936def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0):
937 """Resolve host and port into list of address info entries.
938
939 Translate the host/port argument into a sequence of 5-tuples that contain
940 all the necessary arguments for creating a socket connected to that service.
941 host is a domain name, a string representation of an IPv4/v6 address or
942 None. port is a string service name such as 'http', a numeric port number or
943 None. By passing None as the value of host and port, you can pass NULL to
944 the underlying C API.
945
946 The family, type and proto arguments can be optionally specified in order to
947 narrow the list of addresses returned. Passing zero as a value for each of
948 these arguments selects the full range of results.
949 """
950 # We override this function since we want to translate the numeric family
951 # and socket type values to enum constants.
952 addrlist = []
953 for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
954 af, socktype, proto, canonname, sa = res
955 addrlist.append((_intenum_converter(af, AddressFamily),
956 _intenum_converter(socktype, SocketKind),
957 proto, canonname, sa))
958 return addrlist