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