• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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