1# 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 [*] 15fromshare() -- create a socket object from data received from socket.share() [*] 16gethostname() -- 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 20getprotobyname() -- map a protocol name (e.g. 'tcp') to a number 21ntohs(), 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) 25socket.getdefaulttimeout() -- get the default timeout value 26socket.setdefaulttimeout() -- set the default timeout value 27create_connection() -- connects to an address, with an optional timeout and 28 optional source address. 29 30 [*] not available on all platforms! 31 32Special objects: 33 34SocketType -- type object for socket objects 35error -- exception raised for I/O errors 36has_ipv6 -- boolean value indicating if IPv6 is supported 37 38IntEnum constants: 39 40AF_INET, AF_UNIX -- socket domains (first argument to socket() call) 41SOCK_STREAM, SOCK_DGRAM, SOCK_RAW -- socket types (second argument) 42 43Integer constants: 44 45Many other constants may be defined; these may be used in calls to 46the setsockopt() and getsockopt() methods. 47""" 48 49import _socket 50from _socket import * 51 52import os, sys, io, selectors 53from enum import IntEnum, IntFlag 54 55try: 56 import errno 57except ImportError: 58 errno = None 59EBADF = getattr(errno, 'EBADF', 9) 60EAGAIN = getattr(errno, 'EAGAIN', 11) 61EWOULDBLOCK = getattr(errno, 'EWOULDBLOCK', 11) 62 63__all__ = ["fromfd", "getfqdn", "create_connection", 64 "AddressFamily", "SocketKind"] 65__all__.extend(os._get_exports_list(_socket)) 66 67# 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). 72 73IntEnum._convert( 74 'AddressFamily', 75 __name__, 76 lambda C: C.isupper() and C.startswith('AF_')) 77 78IntEnum._convert( 79 'SocketKind', 80 __name__, 81 lambda C: C.isupper() and C.startswith('SOCK_')) 82 83IntFlag._convert( 84 'MsgFlag', 85 __name__, 86 lambda C: C.isupper() and C.startswith('MSG_')) 87 88IntFlag._convert( 89 'AddressInfo', 90 __name__, 91 lambda C: C.isupper() and C.startswith('AI_')) 92 93_LOCALHOST = '127.0.0.1' 94_LOCALHOST_V6 = '::1' 95 96 97def _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 106 107_realsocket = socket 108 109# WSA error codes 110if sys.platform.lower().startswith("win"): 111 errorTab = {} 112 errorTab[10004] = "The operation was interrupted." 113 errorTab[10009] = "A bad file handle was passed." 114 errorTab[10013] = "Permission denied." 115 errorTab[10014] = "A fault occurred on the network??" # WSAEFAULT 116 errorTab[10022] = "An invalid operation was attempted." 117 errorTab[10035] = "The socket operation would block" 118 errorTab[10036] = "A blocking operation is already in progress." 119 errorTab[10048] = "The network address is in use." 120 errorTab[10054] = "The connection has been reset." 121 errorTab[10058] = "The network has been shut down." 122 errorTab[10060] = "The operation timed out." 123 errorTab[10061] = "Connection refused." 124 errorTab[10063] = "The name is too long." 125 errorTab[10064] = "The host is down." 126 errorTab[10065] = "The host is unreachable." 127 __all__.append("errorTab") 128 129 130class _GiveupOnSendfile(Exception): pass 131 132 133class socket(_socket.socket): 134 135 """A subclass of _socket.socket adding the makefile() method.""" 136 137 __slots__ = ["__weakref__", "_io_refs", "_closed"] 138 139 def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None): 140 # For user code address family and type values are IntEnum members, but 141 # for the underlying _socket.socket they're just integers. The 142 # constructor of _socket.socket converts the given argument to an 143 # integer automatically. 144 _socket.socket.__init__(self, family, type, proto, fileno) 145 self._io_refs = 0 146 self._closed = False 147 148 def __enter__(self): 149 return self 150 151 def __exit__(self, *args): 152 if not self._closed: 153 self.close() 154 155 def __repr__(self): 156 """Wrap __repr__() to reveal the real class name and socket 157 address(es). 158 """ 159 closed = getattr(self, '_closed', False) 160 s = "<%s.%s%s fd=%i, family=%s, type=%s, proto=%i" \ 161 % (self.__class__.__module__, 162 self.__class__.__qualname__, 163 " [closed]" if closed else "", 164 self.fileno(), 165 self.family, 166 self.type, 167 self.proto) 168 if not closed: 169 try: 170 laddr = self.getsockname() 171 if laddr: 172 s += ", laddr=%s" % str(laddr) 173 except error: 174 pass 175 try: 176 raddr = self.getpeername() 177 if raddr: 178 s += ", raddr=%s" % str(raddr) 179 except error: 180 pass 181 s += '>' 182 return s 183 184 def __getstate__(self): 185 raise TypeError("Cannot serialize socket object") 186 187 def dup(self): 188 """dup() -> socket object 189 190 Duplicate the socket. Return a new socket object connected to the same 191 system resource. The new socket is non-inheritable. 192 """ 193 fd = dup(self.fileno()) 194 sock = self.__class__(self.family, self.type, self.proto, fileno=fd) 195 sock.settimeout(self.gettimeout()) 196 return sock 197 198 def accept(self): 199 """accept() -> (socket object, address info) 200 201 Wait for an incoming connection. Return a new socket 202 representing the connection, and the address of the client. 203 For IP sockets, the address info is a pair (hostaddr, port). 204 """ 205 fd, addr = self._accept() 206 # If our type has the SOCK_NONBLOCK flag, we shouldn't pass it onto the 207 # new socket. We do not currently allow passing SOCK_NONBLOCK to 208 # accept4, so the returned socket is always blocking. 209 type = self.type & ~globals().get("SOCK_NONBLOCK", 0) 210 sock = socket(self.family, type, self.proto, fileno=fd) 211 # Issue #7995: if no default timeout is set and the listening 212 # socket had a (non-zero) timeout, force the new socket in blocking 213 # mode to override platform-specific socket flags inheritance. 214 if getdefaulttimeout() is None and self.gettimeout(): 215 sock.setblocking(True) 216 return sock, addr 217 218 def makefile(self, mode="r", buffering=None, *, 219 encoding=None, errors=None, newline=None): 220 """makefile(...) -> an I/O stream connected to the socket 221 222 The arguments are as for io.open() after the filename, except the only 223 supported mode values are 'r' (default), 'w' and 'b'. 224 """ 225 # XXX refactor to share code? 226 if not set(mode) <= {"r", "w", "b"}: 227 raise ValueError("invalid mode %r (only r, w, b allowed)" % (mode,)) 228 writing = "w" in mode 229 reading = "r" in mode or not writing 230 assert reading or writing 231 binary = "b" in mode 232 rawmode = "" 233 if reading: 234 rawmode += "r" 235 if writing: 236 rawmode += "w" 237 raw = SocketIO(self, rawmode) 238 self._io_refs += 1 239 if buffering is None: 240 buffering = -1 241 if buffering < 0: 242 buffering = io.DEFAULT_BUFFER_SIZE 243 if buffering == 0: 244 if not binary: 245 raise ValueError("unbuffered streams must be binary") 246 return raw 247 if reading and writing: 248 buffer = io.BufferedRWPair(raw, raw, buffering) 249 elif reading: 250 buffer = io.BufferedReader(raw, buffering) 251 else: 252 assert writing 253 buffer = io.BufferedWriter(raw, buffering) 254 if binary: 255 return buffer 256 text = io.TextIOWrapper(buffer, encoding, errors, newline) 257 text.mode = mode 258 return text 259 260 if hasattr(os, 'sendfile'): 261 262 def _sendfile_use_sendfile(self, file, offset=0, count=None): 263 self._check_sendfile_params(file, offset, count) 264 sockno = self.fileno() 265 try: 266 fileno = file.fileno() 267 except (AttributeError, io.UnsupportedOperation) as err: 268 raise _GiveupOnSendfile(err) # not a regular file 269 try: 270 fsize = os.fstat(fileno).st_size 271 except OSError as err: 272 raise _GiveupOnSendfile(err) # not a regular file 273 if not fsize: 274 return 0 # empty file 275 blocksize = fsize if not count else count 276 277 timeout = self.gettimeout() 278 if timeout == 0: 279 raise ValueError("non-blocking sockets are not supported") 280 # poll/select have the advantage of not requiring any 281 # extra file descriptor, contrarily to epoll/kqueue 282 # (also, they require a single syscall). 283 if hasattr(selectors, 'PollSelector'): 284 selector = selectors.PollSelector() 285 else: 286 selector = selectors.SelectSelector() 287 selector.register(sockno, selectors.EVENT_WRITE) 288 289 total_sent = 0 290 # localize variable access to minimize overhead 291 selector_select = selector.select 292 os_sendfile = os.sendfile 293 try: 294 while True: 295 if timeout and not selector_select(timeout): 296 raise _socket.timeout('timed out') 297 if count: 298 blocksize = count - total_sent 299 if blocksize <= 0: 300 break 301 try: 302 sent = os_sendfile(sockno, fileno, offset, blocksize) 303 except BlockingIOError: 304 if not timeout: 305 # Block until the socket is ready to send some 306 # data; avoids hogging CPU resources. 307 selector_select() 308 continue 309 except OSError as err: 310 if total_sent == 0: 311 # We can get here for different reasons, the main 312 # one being 'file' is not a regular mmap(2)-like 313 # file, in which case we'll fall back on using 314 # plain send(). 315 raise _GiveupOnSendfile(err) 316 raise err from None 317 else: 318 if sent == 0: 319 break # EOF 320 offset += sent 321 total_sent += sent 322 return total_sent 323 finally: 324 if total_sent > 0 and hasattr(file, 'seek'): 325 file.seek(offset) 326 else: 327 def _sendfile_use_sendfile(self, file, offset=0, count=None): 328 raise _GiveupOnSendfile( 329 "os.sendfile() not available on this platform") 330 331 def _sendfile_use_send(self, file, offset=0, count=None): 332 self._check_sendfile_params(file, offset, count) 333 if self.gettimeout() == 0: 334 raise ValueError("non-blocking sockets are not supported") 335 if offset: 336 file.seek(offset) 337 blocksize = min(count, 8192) if count else 8192 338 total_sent = 0 339 # localize variable access to minimize overhead 340 file_read = file.read 341 sock_send = self.send 342 try: 343 while True: 344 if count: 345 blocksize = min(count - total_sent, blocksize) 346 if blocksize <= 0: 347 break 348 data = memoryview(file_read(blocksize)) 349 if not data: 350 break # EOF 351 while True: 352 try: 353 sent = sock_send(data) 354 except BlockingIOError: 355 continue 356 else: 357 total_sent += sent 358 if sent < len(data): 359 data = data[sent:] 360 else: 361 break 362 return total_sent 363 finally: 364 if total_sent > 0 and hasattr(file, 'seek'): 365 file.seek(offset + total_sent) 366 367 def _check_sendfile_params(self, file, offset, count): 368 if 'b' not in getattr(file, 'mode', 'b'): 369 raise ValueError("file should be opened in binary mode") 370 if not self.type & SOCK_STREAM: 371 raise ValueError("only SOCK_STREAM type sockets are supported") 372 if count is not None: 373 if not isinstance(count, int): 374 raise TypeError( 375 "count must be a positive integer (got {!r})".format(count)) 376 if count <= 0: 377 raise ValueError( 378 "count must be a positive integer (got {!r})".format(count)) 379 380 def sendfile(self, file, offset=0, count=None): 381 """sendfile(file[, offset[, count]]) -> sent 382 383 Send a file until EOF is reached by using high-performance 384 os.sendfile() and return the total number of bytes which 385 were sent. 386 *file* must be a regular file object opened in binary mode. 387 If os.sendfile() is not available (e.g. Windows) or file is 388 not a regular file socket.send() will be used instead. 389 *offset* tells from where to start reading the file. 390 If specified, *count* is the total number of bytes to transmit 391 as opposed to sending the file until EOF is reached. 392 File position is updated on return or also in case of error in 393 which case file.tell() can be used to figure out the number of 394 bytes which were sent. 395 The socket must be of SOCK_STREAM type. 396 Non-blocking sockets are not supported. 397 """ 398 try: 399 return self._sendfile_use_sendfile(file, offset, count) 400 except _GiveupOnSendfile: 401 return self._sendfile_use_send(file, offset, count) 402 403 def _decref_socketios(self): 404 if self._io_refs > 0: 405 self._io_refs -= 1 406 if self._closed: 407 self.close() 408 409 def _real_close(self, _ss=_socket.socket): 410 # This function should not reference any globals. See issue #808164. 411 _ss.close(self) 412 413 def close(self): 414 # This function should not reference any globals. See issue #808164. 415 self._closed = True 416 if self._io_refs <= 0: 417 self._real_close() 418 419 def detach(self): 420 """detach() -> file descriptor 421 422 Close the socket object without closing the underlying file descriptor. 423 The object cannot be used after this call, but the file descriptor 424 can be reused for other purposes. The file descriptor is returned. 425 """ 426 self._closed = True 427 return super().detach() 428 429 @property 430 def family(self): 431 """Read-only access to the address family for this socket. 432 """ 433 return _intenum_converter(super().family, AddressFamily) 434 435 @property 436 def type(self): 437 """Read-only access to the socket type. 438 """ 439 return _intenum_converter(super().type, SocketKind) 440 441 if os.name == 'nt': 442 def get_inheritable(self): 443 return os.get_handle_inheritable(self.fileno()) 444 def set_inheritable(self, inheritable): 445 os.set_handle_inheritable(self.fileno(), inheritable) 446 else: 447 def get_inheritable(self): 448 return os.get_inheritable(self.fileno()) 449 def set_inheritable(self, inheritable): 450 os.set_inheritable(self.fileno(), inheritable) 451 get_inheritable.__doc__ = "Get the inheritable flag of the socket" 452 set_inheritable.__doc__ = "Set the inheritable flag of the socket" 453 454def fromfd(fd, family, type, proto=0): 455 """ fromfd(fd, family, type[, proto]) -> socket object 456 457 Create a socket object from a duplicate of the given file 458 descriptor. The remaining arguments are the same as for socket(). 459 """ 460 nfd = dup(fd) 461 return socket(family, type, proto, nfd) 462 463if hasattr(_socket.socket, "share"): 464 def fromshare(info): 465 """ fromshare(info) -> socket object 466 467 Create a socket object from the bytes object returned by 468 socket.share(pid). 469 """ 470 return socket(0, 0, 0, info) 471 __all__.append("fromshare") 472 473if hasattr(_socket, "socketpair"): 474 475 def socketpair(family=None, type=SOCK_STREAM, proto=0): 476 """socketpair([family[, type[, proto]]]) -> (socket object, socket object) 477 478 Create a pair of socket objects from the sockets returned by the platform 479 socketpair() function. 480 The arguments are the same as for socket() except the default family is 481 AF_UNIX if defined on the platform; otherwise, the default is AF_INET. 482 """ 483 if family is None: 484 try: 485 family = AF_UNIX 486 except NameError: 487 family = AF_INET 488 a, b = _socket.socketpair(family, type, proto) 489 a = socket(family, type, proto, a.detach()) 490 b = socket(family, type, proto, b.detach()) 491 return a, b 492 493else: 494 495 # Origin: https://gist.github.com/4325783, by Geert Jansen. Public domain. 496 def socketpair(family=AF_INET, type=SOCK_STREAM, proto=0): 497 if family == AF_INET: 498 host = _LOCALHOST 499 elif family == AF_INET6: 500 host = _LOCALHOST_V6 501 else: 502 raise ValueError("Only AF_INET and AF_INET6 socket address families " 503 "are supported") 504 if type != SOCK_STREAM: 505 raise ValueError("Only SOCK_STREAM socket type is supported") 506 if proto != 0: 507 raise ValueError("Only protocol zero is supported") 508 509 # We create a connected TCP socket. Note the trick with 510 # setblocking(False) that prevents us from having to create a thread. 511 lsock = socket(family, type, proto) 512 try: 513 lsock.bind((host, 0)) 514 lsock.listen() 515 # On IPv6, ignore flow_info and scope_id 516 addr, port = lsock.getsockname()[:2] 517 csock = socket(family, type, proto) 518 try: 519 csock.setblocking(False) 520 try: 521 csock.connect((addr, port)) 522 except (BlockingIOError, InterruptedError): 523 pass 524 csock.setblocking(True) 525 ssock, _ = lsock.accept() 526 except: 527 csock.close() 528 raise 529 finally: 530 lsock.close() 531 return (ssock, csock) 532 __all__.append("socketpair") 533 534socketpair.__doc__ = """socketpair([family[, type[, proto]]]) -> (socket object, socket object) 535Create a pair of socket objects from the sockets returned by the platform 536socketpair() function. 537The arguments are the same as for socket() except the default family is AF_UNIX 538if defined on the platform; otherwise, the default is AF_INET. 539""" 540 541_blocking_errnos = { EAGAIN, EWOULDBLOCK } 542 543class SocketIO(io.RawIOBase): 544 545 """Raw I/O implementation for stream sockets. 546 547 This class supports the makefile() method on sockets. It provides 548 the raw I/O interface on top of a socket object. 549 """ 550 551 # One might wonder why not let FileIO do the job instead. There are two 552 # main reasons why FileIO is not adapted: 553 # - it wouldn't work under Windows (where you can't used read() and 554 # write() on a socket handle) 555 # - it wouldn't work with socket timeouts (FileIO would ignore the 556 # timeout and consider the socket non-blocking) 557 558 # XXX More docs 559 560 def __init__(self, sock, mode): 561 if mode not in ("r", "w", "rw", "rb", "wb", "rwb"): 562 raise ValueError("invalid mode: %r" % mode) 563 io.RawIOBase.__init__(self) 564 self._sock = sock 565 if "b" not in mode: 566 mode += "b" 567 self._mode = mode 568 self._reading = "r" in mode 569 self._writing = "w" in mode 570 self._timeout_occurred = False 571 572 def readinto(self, b): 573 """Read up to len(b) bytes into the writable buffer *b* and return 574 the number of bytes read. If the socket is non-blocking and no bytes 575 are available, None is returned. 576 577 If *b* is non-empty, a 0 return value indicates that the connection 578 was shutdown at the other end. 579 """ 580 self._checkClosed() 581 self._checkReadable() 582 if self._timeout_occurred: 583 raise OSError("cannot read from timed out object") 584 while True: 585 try: 586 return self._sock.recv_into(b) 587 except timeout: 588 self._timeout_occurred = True 589 raise 590 except error as e: 591 if e.args[0] in _blocking_errnos: 592 return None 593 raise 594 595 def write(self, b): 596 """Write the given bytes or bytearray object *b* to the socket 597 and return the number of bytes written. This can be less than 598 len(b) if not all data could be written. If the socket is 599 non-blocking and no bytes could be written None is returned. 600 """ 601 self._checkClosed() 602 self._checkWritable() 603 try: 604 return self._sock.send(b) 605 except error as e: 606 # XXX what about EINTR? 607 if e.args[0] in _blocking_errnos: 608 return None 609 raise 610 611 def readable(self): 612 """True if the SocketIO is open for reading. 613 """ 614 if self.closed: 615 raise ValueError("I/O operation on closed socket.") 616 return self._reading 617 618 def writable(self): 619 """True if the SocketIO is open for writing. 620 """ 621 if self.closed: 622 raise ValueError("I/O operation on closed socket.") 623 return self._writing 624 625 def seekable(self): 626 """True if the SocketIO is open for seeking. 627 """ 628 if self.closed: 629 raise ValueError("I/O operation on closed socket.") 630 return super().seekable() 631 632 def fileno(self): 633 """Return the file descriptor of the underlying socket. 634 """ 635 self._checkClosed() 636 return self._sock.fileno() 637 638 @property 639 def name(self): 640 if not self.closed: 641 return self.fileno() 642 else: 643 return -1 644 645 @property 646 def mode(self): 647 return self._mode 648 649 def close(self): 650 """Close the SocketIO object. This doesn't close the underlying 651 socket, except if all references to it have disappeared. 652 """ 653 if self.closed: 654 return 655 io.RawIOBase.close(self) 656 self._sock._decref_socketios() 657 self._sock = None 658 659 660def getfqdn(name=''): 661 """Get fully qualified domain name from name. 662 663 An empty argument is interpreted as meaning the local host. 664 665 First the hostname returned by gethostbyaddr() is checked, then 666 possibly existing aliases. In case no FQDN is available, hostname 667 from gethostname() is returned. 668 """ 669 name = name.strip() 670 if not name or name == '0.0.0.0': 671 name = gethostname() 672 try: 673 hostname, aliases, ipaddrs = gethostbyaddr(name) 674 except error: 675 pass 676 else: 677 aliases.insert(0, hostname) 678 for name in aliases: 679 if '.' in name: 680 break 681 else: 682 name = hostname 683 return name 684 685 686_GLOBAL_DEFAULT_TIMEOUT = object() 687 688def create_connection(address, timeout=_GLOBAL_DEFAULT_TIMEOUT, 689 source_address=None): 690 """Connect to *address* and return the socket object. 691 692 Convenience function. Connect to *address* (a 2-tuple ``(host, 693 port)``) and return the socket object. Passing the optional 694 *timeout* parameter will set the timeout on the socket instance 695 before attempting to connect. If no *timeout* is supplied, the 696 global default timeout setting returned by :func:`getdefaulttimeout` 697 is used. If *source_address* is set it must be a tuple of (host, port) 698 for the socket to bind as a source address before making the connection. 699 A host of '' or port 0 tells the OS to use the default. 700 """ 701 702 host, port = address 703 err = None 704 for res in getaddrinfo(host, port, 0, SOCK_STREAM): 705 af, socktype, proto, canonname, sa = res 706 sock = None 707 try: 708 sock = socket(af, socktype, proto) 709 if timeout is not _GLOBAL_DEFAULT_TIMEOUT: 710 sock.settimeout(timeout) 711 if source_address: 712 sock.bind(source_address) 713 sock.connect(sa) 714 return sock 715 716 except error as _: 717 err = _ 718 if sock is not None: 719 sock.close() 720 721 if err is not None: 722 raise err 723 else: 724 raise error("getaddrinfo returns an empty list") 725 726def getaddrinfo(host, port, family=0, type=0, proto=0, flags=0): 727 """Resolve host and port into list of address info entries. 728 729 Translate the host/port argument into a sequence of 5-tuples that contain 730 all the necessary arguments for creating a socket connected to that service. 731 host is a domain name, a string representation of an IPv4/v6 address or 732 None. port is a string service name such as 'http', a numeric port number or 733 None. By passing None as the value of host and port, you can pass NULL to 734 the underlying C API. 735 736 The family, type and proto arguments can be optionally specified in order to 737 narrow the list of addresses returned. Passing zero as a value for each of 738 these arguments selects the full range of results. 739 """ 740 # We override this function since we want to translate the numeric family 741 # and socket type values to enum constants. 742 addrlist = [] 743 for res in _socket.getaddrinfo(host, port, family, type, proto, flags): 744 af, socktype, proto, canonname, sa = res 745 addrlist.append((_intenum_converter(af, AddressFamily), 746 _intenum_converter(socktype, SocketKind), 747 proto, canonname, sa)) 748 return addrlist 749