:mod:`!socket` --- Low-level networking interface
=================================================

.. module:: socket
   :synopsis: Low-level networking interface.

**Source code:** :source:`Lib/socket.py`

--------------

This module provides access to the BSD *socket* interface. It is available on
all modern Unix systems, Windows, MacOS, and probably additional platforms.

.. note::

   Some behavior may be platform dependent, since calls are made to the operating
   system socket APIs.


.. include:: ../includes/wasm-notavail.rst

.. index:: pair: object; socket

The Python interface is a straightforward transliteration of the Unix system
call and library interface for sockets to Python's object-oriented style: the
:func:`~socket.socket` function returns a :dfn:`socket object` whose methods implement
the various socket system calls.  Parameter types are somewhat higher-level than
in the C interface: as with :meth:`read` and :meth:`write` operations on Python
files, buffer allocation on receive operations is automatic, and buffer length
is implicit on send operations.


.. seealso::

   Module :mod:`socketserver`
      Classes that simplify writing network servers.

   Module :mod:`ssl`
      A TLS/SSL wrapper for socket objects.


.. _socket-addresses:

Socket families
---------------

Depending on the system and the build options, various socket families
are supported by this module.

The address format required by a particular socket object is automatically
selected based on the address family specified when the socket object was
created.  Socket addresses are represented as follows:

- The address of an :const:`AF_UNIX` socket bound to a file system node
  is represented as a string, using the file system encoding and the
  ``'surrogateescape'`` error handler (see :pep:`383`).  An address in
  Linux's abstract namespace is returned as a :term:`bytes-like object` with
  an initial null byte; note that sockets in this namespace can
  communicate with normal file system sockets, so programs intended to
  run on Linux may need to deal with both types of address.  A string or
  bytes-like object can be used for either type of address when
  passing it as an argument.

  .. versionchanged:: 3.3
     Previously, :const:`AF_UNIX` socket paths were assumed to use UTF-8
     encoding.

  .. versionchanged:: 3.5
     Writable :term:`bytes-like object` is now accepted.

.. _host_port:

- A pair ``(host, port)`` is used for the :const:`AF_INET` address family,
  where *host* is a string representing either a hostname in internet domain
  notation like ``'daring.cwi.nl'`` or an IPv4 address like ``'100.50.200.5'``,
  and *port* is an integer.

  - For IPv4 addresses, two special forms are accepted instead of a host
    address: ``''`` represents :const:`INADDR_ANY`, which is used to bind to all
    interfaces, and the string ``'<broadcast>'`` represents
    :const:`INADDR_BROADCAST`.  This behavior is not compatible with IPv6,
    therefore, you may want to avoid these if you intend to support IPv6 with your
    Python programs.

- For :const:`AF_INET6` address family, a four-tuple ``(host, port, flowinfo,
  scope_id)`` is used, where *flowinfo* and *scope_id* represent the ``sin6_flowinfo``
  and ``sin6_scope_id`` members in :const:`struct sockaddr_in6` in C.  For
  :mod:`!socket` module methods, *flowinfo* and *scope_id* can be omitted just for
  backward compatibility.  Note, however, omission of *scope_id* can cause problems
  in manipulating scoped IPv6 addresses.

  .. versionchanged:: 3.7
     For multicast addresses (with *scope_id* meaningful) *address* may not contain
     ``%scope_id`` (or ``zone id``) part. This information is superfluous and may
     be safely omitted (recommended).

- :const:`AF_NETLINK` sockets are represented as pairs ``(pid, groups)``.

- Linux-only support for TIPC is available using the :const:`AF_TIPC`
  address family.  TIPC is an open, non-IP based networked protocol designed
  for use in clustered computer environments.  Addresses are represented by a
  tuple, and the fields depend on the address type. The general tuple form is
  ``(addr_type, v1, v2, v3 [, scope])``, where:

  - *addr_type* is one of :const:`TIPC_ADDR_NAMESEQ`, :const:`TIPC_ADDR_NAME`,
    or :const:`TIPC_ADDR_ID`.
  - *scope* is one of :const:`TIPC_ZONE_SCOPE`, :const:`TIPC_CLUSTER_SCOPE`, and
    :const:`TIPC_NODE_SCOPE`.
  - If *addr_type* is :const:`TIPC_ADDR_NAME`, then *v1* is the server type, *v2* is
    the port identifier, and *v3* should be 0.

    If *addr_type* is :const:`TIPC_ADDR_NAMESEQ`, then *v1* is the server type, *v2*
    is the lower port number, and *v3* is the upper port number.

    If *addr_type* is :const:`TIPC_ADDR_ID`, then *v1* is the node, *v2* is the
    reference, and *v3* should be set to 0.

- A tuple ``(interface, )`` is used for the :const:`AF_CAN` address family,
  where *interface* is a string representing a network interface name like
  ``'can0'``. The network interface name ``''`` can be used to receive packets
  from all network interfaces of this family.

  - :const:`CAN_ISOTP` protocol requires a tuple ``(interface, rx_addr, tx_addr)``
    where both additional parameters are unsigned long integer that represent a
    CAN identifier (standard or extended).
  - :const:`CAN_J1939` protocol requires a tuple ``(interface, name, pgn, addr)``
    where additional parameters are 64-bit unsigned integer representing the
    ECU name, a 32-bit unsigned integer representing the Parameter Group Number
    (PGN), and an 8-bit integer representing the address.

- A string or a tuple ``(id, unit)`` is used for the :const:`SYSPROTO_CONTROL`
  protocol of the :const:`PF_SYSTEM` family. The string is the name of a
  kernel control using a dynamically assigned ID. The tuple can be used if ID
  and unit number of the kernel control are known or if a registered ID is
  used.

  .. versionadded:: 3.3

- :const:`AF_BLUETOOTH` supports the following protocols and address
  formats:

  - :const:`BTPROTO_L2CAP` accepts a tuple
    ``(bdaddr, psm[, cid[, bdaddr_type]])`` where:

    - ``bdaddr`` is a string specifying the Bluetooth address.
    - ``psm`` is an integer specifying the Protocol/Service Multiplexer.
    - ``cid`` is an optional integer specifying the Channel Identifier.
      If not given, defaults to zero.
    - ``bdaddr_type`` is an optional integer specifying the address type;
      one of :const:`BDADDR_BREDR` (default), :const:`BDADDR_LE_PUBLIC`,
      :const:`BDADDR_LE_RANDOM`.

    .. versionchanged:: 3.14
       Added ``cid`` and ``bdaddr_type`` fields.

  - :const:`BTPROTO_RFCOMM` accepts ``(bdaddr, channel)`` where ``bdaddr``
    is the Bluetooth address as a string and ``channel`` is an integer.

  - :const:`BTPROTO_HCI` accepts a format that depends on your OS.

    - On Linux it accepts an integer ``device_id`` or a tuple
      ``(device_id, [channel])`` where ``device_id``
      specifies the number of the Bluetooth device,
      and ``channel`` is an optional integer specifying the HCI channel
      (:const:`HCI_CHANNEL_RAW` by default).
    - On FreeBSD, NetBSD and DragonFly BSD it accepts ``bdaddr``
      where ``bdaddr`` is the Bluetooth address as a string.

    .. versionchanged:: 3.2
       NetBSD and DragonFlyBSD support added.

    .. versionchanged:: 3.13.3
       FreeBSD support added.

    .. versionchanged:: 3.14
       Added ``channel`` field.
       ``device_id`` not packed in a tuple is now accepted.

  - :const:`BTPROTO_SCO` accepts ``bdaddr`` where ``bdaddr`` is
    the Bluetooth address as a string or a :class:`bytes` object.
    (ex. ``'12:23:34:45:56:67'`` or ``b'12:23:34:45:56:67'``)

    .. versionchanged:: 3.14
       FreeBSD support added.

- :const:`AF_ALG` is a Linux-only socket based interface to Kernel
  cryptography. An algorithm socket is configured with a tuple of two to four
  elements ``(type, name [, feat [, mask]])``, where:

  - *type* is the algorithm type as string, e.g. ``aead``, ``hash``,
    ``skcipher`` or ``rng``.

  - *name* is the algorithm name and operation mode as string, e.g.
    ``sha256``, ``hmac(sha256)``, ``cbc(aes)`` or ``drbg_nopr_ctr_aes256``.

  - *feat* and *mask* are unsigned 32bit integers.

  .. availability:: Linux >= 2.6.38.

     Some algorithm types require more recent Kernels.

  .. versionadded:: 3.6

- :const:`AF_VSOCK` allows communication between virtual machines and
  their hosts. The sockets are represented as a ``(CID, port)`` tuple
  where the context ID or CID and port are integers.

  .. availability:: Linux >= 3.9

     See :manpage:`vsock(7)`

  .. versionadded:: 3.7

- :const:`AF_PACKET` is a low-level interface directly to network devices.
  The addresses are represented by the tuple
  ``(ifname, proto[, pkttype[, hatype[, addr]]])`` where:

  - *ifname* - String specifying the device name.
  - *proto* - The Ethernet protocol number.
    May be :data:`ETH_P_ALL` to capture all protocols,
    one of the :ref:`ETHERTYPE_* constants <socket-ethernet-types>`
    or any other Ethernet protocol number.
  - *pkttype* - Optional integer specifying the packet type:

    - ``PACKET_HOST`` (the default) - Packet addressed to the local host.
    - ``PACKET_BROADCAST`` - Physical-layer broadcast packet.
    - ``PACKET_MULTICAST`` - Packet sent to a physical-layer multicast address.
    - ``PACKET_OTHERHOST`` - Packet to some other host that has been caught by
      a device driver in promiscuous mode.
    - ``PACKET_OUTGOING`` - Packet originating from the local host that is
      looped back to a packet socket.
  - *hatype* - Optional integer specifying the ARP hardware address type.
  - *addr* - Optional bytes-like object specifying the hardware physical
    address, whose interpretation depends on the device.

  .. availability:: Linux >= 2.2.

- :const:`AF_QIPCRTR` is a Linux-only socket based interface for communicating
  with services running on co-processors in Qualcomm platforms. The address
  family is represented as a ``(node, port)`` tuple where the *node* and *port*
  are non-negative integers.

  .. availability:: Linux >= 4.7.

  .. versionadded:: 3.8

- :const:`IPPROTO_UDPLITE` is a variant of UDP which allows you to specify
  what portion of a packet is covered with the checksum. It adds two socket
  options that you can change.
  ``self.setsockopt(IPPROTO_UDPLITE, UDPLITE_SEND_CSCOV, length)`` will
  change what portion of outgoing packets are covered by the checksum and
  ``self.setsockopt(IPPROTO_UDPLITE, UDPLITE_RECV_CSCOV, length)`` will
  filter out packets which cover too little of their data. In both cases
  ``length`` should be in ``range(8, 2**16, 8)``.

  Such a socket should be constructed with
  ``socket(AF_INET, SOCK_DGRAM, IPPROTO_UDPLITE)`` for IPv4 or
  ``socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDPLITE)`` for IPv6.

  .. availability:: Linux >= 2.6.20, FreeBSD >= 10.1

  .. versionadded:: 3.9

- :const:`AF_HYPERV` is a Windows-only socket based interface for communicating
  with Hyper-V hosts and guests. The address family is represented as a
  ``(vm_id, service_id)`` tuple where the ``vm_id`` and ``service_id`` are
  UUID strings.

  The ``vm_id`` is the virtual machine identifier or a set of known VMID values
  if the target is not a specific virtual machine. Known VMID constants
  defined on ``socket`` are:

  - ``HV_GUID_ZERO``
  - ``HV_GUID_BROADCAST``
  - ``HV_GUID_WILDCARD`` - Used to bind on itself and accept connections from
    all partitions.
  - ``HV_GUID_CHILDREN`` - Used to bind on itself and accept connection from
    child partitions.
  - ``HV_GUID_LOOPBACK`` - Used as a target to itself.
  - ``HV_GUID_PARENT`` - When used as a bind accepts connection from the parent
    partition. When used as an address target it will connect to the parent partition.

  The ``service_id`` is the service identifier of the registered service.

  .. versionadded:: 3.12

If you use a hostname in the *host* portion of IPv4/v6 socket address, the
program may show a nondeterministic behavior, as Python uses the first address
returned from the DNS resolution.  The socket address will be resolved
differently into an actual IPv4/v6 address, depending on the results from DNS
resolution and/or the host configuration.  For deterministic behavior use a
numeric address in *host* portion.

All errors raise exceptions.  The normal exceptions for invalid argument types
and out-of-memory conditions can be raised. Errors
related to socket or address semantics raise :exc:`OSError` or one of its
subclasses.

Non-blocking mode is supported through :meth:`~socket.setblocking`.  A
generalization of this based on timeouts is supported through
:meth:`~socket.settimeout`.


Module contents
---------------

The module :mod:`!socket` exports the following elements.


Exceptions
^^^^^^^^^^

.. exception:: error

   A deprecated alias of :exc:`OSError`.

   .. versionchanged:: 3.3
      Following :pep:`3151`, this class was made an alias of :exc:`OSError`.


.. exception:: herror

   A subclass of :exc:`OSError`, this exception is raised for
   address-related errors, i.e. for functions that use *h_errno* in the POSIX
   C API, including :func:`gethostbyname_ex` and :func:`gethostbyaddr`.
   The accompanying value is a pair ``(h_errno, string)`` representing an
   error returned by a library call.  *h_errno* is a numeric value, while
   *string* represents the description of *h_errno*, as returned by the
   :c:func:`hstrerror` C function.

   .. versionchanged:: 3.3
      This class was made a subclass of :exc:`OSError`.

.. exception:: gaierror

   A subclass of :exc:`OSError`, this exception is raised for
   address-related errors by :func:`getaddrinfo` and :func:`getnameinfo`.
   The accompanying value is a pair ``(error, string)`` representing an error
   returned by a library call.  *string* represents the description of
   *error*, as returned by the :c:func:`gai_strerror` C function.  The
   numeric *error* value will match one of the :const:`!EAI_\*` constants
   defined in this module.

   .. versionchanged:: 3.3
      This class was made a subclass of :exc:`OSError`.

.. exception:: timeout

   A deprecated alias of :exc:`TimeoutError`.

   A subclass of :exc:`OSError`, this exception is raised when a timeout
   occurs on a socket which has had timeouts enabled via a prior call to
   :meth:`~socket.settimeout` (or implicitly through
   :func:`~socket.setdefaulttimeout`).  The accompanying value is a string
   whose value is currently always "timed out".

   .. versionchanged:: 3.3
      This class was made a subclass of :exc:`OSError`.

   .. versionchanged:: 3.10
      This class was made an alias of :exc:`TimeoutError`.


Constants
^^^^^^^^^

The AF_* and SOCK_* constants are now :class:`AddressFamily` and
:class:`SocketKind` :class:`.IntEnum` collections.

.. versionadded:: 3.4

.. data:: AF_UNIX
          AF_INET
          AF_INET6

   These constants represent the address (and protocol) families, used for the
   first argument to :func:`~socket.socket`.  If the :const:`AF_UNIX` constant is not
   defined then this protocol is unsupported.  More constants may be available
   depending on the system.

.. data:: AF_UNSPEC

   :const:`AF_UNSPEC` means that
   :func:`getaddrinfo` should return socket addresses for any
   address family (either IPv4, IPv6, or any other) that can be used.

.. data:: SOCK_STREAM
          SOCK_DGRAM
          SOCK_RAW
          SOCK_RDM
          SOCK_SEQPACKET

   These constants represent the socket types, used for the second argument to
   :func:`~socket.socket`.  More constants may be available depending on the system.
   (Only :const:`SOCK_STREAM` and :const:`SOCK_DGRAM` appear to be generally
   useful.)

.. data:: SOCK_CLOEXEC
          SOCK_NONBLOCK

   These two constants, if defined, can be combined with the socket types and
   allow you to set some flags atomically (thus avoiding possible race
   conditions and the need for separate calls).

   .. seealso::

      `Secure File Descriptor Handling <https://udrepper.livejournal.com/20407.html>`_
      for a more thorough explanation.

   .. availability:: Linux >= 2.6.27.

   .. versionadded:: 3.2

.. _socket-unix-constants:

.. data:: SO_*
          SOMAXCONN
          MSG_*
          SOL_*
          SCM_*
          IPPROTO_*
          IPPORT_*
          INADDR_*
          IP_*
          IPV6_*
          EAI_*
          AI_*
          NI_*
          TCP_*

   Many constants of these forms, documented in the Unix documentation on sockets
   and/or the IP protocol, are also defined in the socket module. They are
   generally used in arguments to the :meth:`~socket.setsockopt` and :meth:`~socket.getsockopt`
   methods of socket objects.  In most cases, only those symbols that are defined
   in the Unix header files are defined; for a few symbols, default values are
   provided.

   .. versionchanged:: 3.6
      ``SO_DOMAIN``, ``SO_PROTOCOL``, ``SO_PEERSEC``, ``SO_PASSSEC``,
      ``TCP_USER_TIMEOUT``, ``TCP_CONGESTION`` were added.

   .. versionchanged:: 3.6.5
      Added support for ``TCP_FASTOPEN``, ``TCP_KEEPCNT`` on Windows platforms
      when available.

   .. versionchanged:: 3.7
      ``TCP_NOTSENT_LOWAT`` was added.

      Added support for ``TCP_KEEPIDLE``, ``TCP_KEEPINTVL`` on Windows platforms
      when available.

   .. versionchanged:: 3.10
      ``IP_RECVTOS`` was added.
       Added ``TCP_KEEPALIVE``. On MacOS this constant can be used in the same
       way that ``TCP_KEEPIDLE`` is used on Linux.

   .. versionchanged:: 3.11
      Added ``TCP_CONNECTION_INFO``. On MacOS this constant can be used in the
      same way that ``TCP_INFO`` is used on Linux and BSD.

   .. versionchanged:: 3.12
      Added ``SO_RTABLE`` and ``SO_USER_COOKIE``. On OpenBSD
      and FreeBSD respectively those constants can be used in the same way that
      ``SO_MARK`` is used on Linux. Also added missing TCP socket options from
      Linux: ``TCP_MD5SIG``, ``TCP_THIN_LINEAR_TIMEOUTS``, ``TCP_THIN_DUPACK``,
      ``TCP_REPAIR``, ``TCP_REPAIR_QUEUE``, ``TCP_QUEUE_SEQ``,
      ``TCP_REPAIR_OPTIONS``, ``TCP_TIMESTAMP``, ``TCP_CC_INFO``,
      ``TCP_SAVE_SYN``, ``TCP_SAVED_SYN``, ``TCP_REPAIR_WINDOW``,
      ``TCP_FASTOPEN_CONNECT``, ``TCP_ULP``, ``TCP_MD5SIG_EXT``,
      ``TCP_FASTOPEN_KEY``, ``TCP_FASTOPEN_NO_COOKIE``,
      ``TCP_ZEROCOPY_RECEIVE``, ``TCP_INQ``, ``TCP_TX_DELAY``.
      Added ``IP_PKTINFO``, ``IP_UNBLOCK_SOURCE``, ``IP_BLOCK_SOURCE``,
      ``IP_ADD_SOURCE_MEMBERSHIP``, ``IP_DROP_SOURCE_MEMBERSHIP``.

   .. versionchanged:: 3.13
      Added ``SO_BINDTOIFINDEX``. On Linux this constant can be used in the
      same way that ``SO_BINDTODEVICE`` is used, but with the index of a
      network interface instead of its name.

   .. versionchanged:: 3.14
      Added missing ``IP_FREEBIND``, ``IP_RECVERR``, ``IPV6_RECVERR``,
      ``IP_RECVTTL``, and ``IP_RECVORIGDSTADDR`` on Linux.

   .. versionchanged:: 3.14
      Added support for ``TCP_QUICKACK`` on Windows platforms when available.

   .. versionchanged:: 3.15
      ``IPV6_HDRINCL`` was added.
      Added support for ``SO_PASSRIGHTS`` on Linux platforms when available.


.. data:: AF_CAN
          PF_CAN
          SOL_CAN_*
          CAN_*

   Many constants of these forms, documented in the Linux documentation, are
   also defined in the socket module.

   .. availability:: Linux >= 2.6.25, NetBSD >= 8.

   .. versionadded:: 3.3

   .. versionchanged:: 3.11
      NetBSD support was added.

   .. versionchanged:: 3.14
      Restored missing ``CAN_RAW_ERR_FILTER`` on Linux.

.. data:: CAN_BCM
          CAN_BCM_*

   CAN_BCM, in the CAN protocol family, is the broadcast manager (BCM) protocol.
   Broadcast manager constants, documented in the Linux documentation, are also
   defined in the socket module.

   .. availability:: Linux >= 2.6.25.

   .. note::
      The :data:`CAN_BCM_CAN_FD_FRAME` flag is only available on Linux >= 4.8.

   .. versionadded:: 3.4

.. data:: CAN_RAW_FD_FRAMES

   Enables CAN FD support in a CAN_RAW socket. This is disabled by default.
   This allows your application to send both CAN and CAN FD frames; however,
   you must accept both CAN and CAN FD frames when reading from the socket.

   This constant is documented in the Linux documentation.

   .. availability:: Linux >= 3.6.

   .. versionadded:: 3.5

.. data:: CAN_RAW_JOIN_FILTERS

   Joins the applied CAN filters such that only CAN frames that match all
   given CAN filters are passed to user space.

   This constant is documented in the Linux documentation.

   .. availability:: Linux >= 4.1.

   .. versionadded:: 3.9

.. data:: CAN_ISOTP

   CAN_ISOTP, in the CAN protocol family, is the ISO-TP (ISO 15765-2) protocol.
   ISO-TP constants, documented in the Linux documentation.

   .. availability:: Linux >= 2.6.25.

   .. versionadded:: 3.7

.. data:: CAN_J1939

   CAN_J1939, in the CAN protocol family, is the SAE J1939 protocol.
   J1939 constants, documented in the Linux documentation.

   .. availability:: Linux >= 5.4.

   .. versionadded:: 3.9


.. data:: AF_DIVERT
          PF_DIVERT

   These two constants, documented in the FreeBSD divert(4) manual page, are
   also defined in the socket module.

   .. availability:: FreeBSD >= 14.0.

   .. versionadded:: 3.12


.. data:: AF_PACKET
          PF_PACKET
          PACKET_*

   Many constants of these forms, documented in the Linux documentation, are
   also defined in the socket module.

   .. availability:: Linux >= 2.2.


.. data:: ETH_P_ALL

   :data:`!ETH_P_ALL` can be used in the :class:`~socket.socket`
   constructor as *proto* for the :const:`AF_PACKET` family in order to
   capture every packet, regardless of protocol.

   For more information, see the :manpage:`packet(7)` manpage.

   .. availability:: Linux.

   .. versionadded:: 3.12


.. data:: AF_RDS
          PF_RDS
          SOL_RDS
          RDS_*

   Many constants of these forms, documented in the Linux documentation, are
   also defined in the socket module.

   .. availability:: Linux >= 2.6.30.

   .. versionadded:: 3.3


.. data:: SIO_RCVALL
          SIO_KEEPALIVE_VALS
          SIO_LOOPBACK_FAST_PATH
          RCVALL_*

   Constants for Windows' WSAIoctl(). The constants are used as arguments to the
   :meth:`~socket.socket.ioctl` method of socket objects.

   .. versionchanged:: 3.6
      ``SIO_LOOPBACK_FAST_PATH`` was added.


.. data:: TIPC_*

   TIPC related constants, matching the ones exported by the C socket API. See
   the TIPC documentation for more information.

.. data:: AF_ALG
          SOL_ALG
          ALG_*

   Constants for Linux Kernel cryptography.

   .. availability:: Linux >= 2.6.38.

   .. versionadded:: 3.6


.. data:: AF_VSOCK
          IOCTL_VM_SOCKETS_GET_LOCAL_CID
          VMADDR*
          SO_VM*

   Constants for Linux host/guest communication.

   .. availability:: Linux >= 4.8.

   .. versionadded:: 3.7

.. data:: AF_LINK

  .. availability:: BSD, macOS.

  .. versionadded:: 3.4

.. data:: has_ipv6

   This constant contains a boolean value which indicates if IPv6 is supported on
   this platform.

.. data:: AF_BLUETOOTH
          BTPROTO_L2CAP
          BTPROTO_RFCOMM
          BTPROTO_HCI
          BTPROTO_SCO

   Integer constants for use with Bluetooth addresses.

.. data:: BDADDR_ANY
          BDADDR_LOCAL

   These are string constants containing Bluetooth addresses with special
   meanings. For example, :const:`BDADDR_ANY` can be used to indicate
   any address when specifying the binding socket with
   :const:`BTPROTO_RFCOMM`.

.. data:: BDADDR_BREDR
          BDADDR_LE_PUBLIC
          BDADDR_LE_RANDOM

   These constants describe the Bluetooth address type when binding or
   connecting a :const:`BTPROTO_L2CAP` socket.

   .. availability:: Linux, FreeBSD

   .. versionadded:: 3.14

.. data:: SOL_RFCOMM
          SOL_L2CAP
          SOL_HCI
          SOL_SCO
          SOL_BLUETOOTH

   Used in the level argument to the :meth:`~socket.setsockopt` and
   :meth:`~socket.getsockopt` methods of Bluetooth socket objects.

   :const:`SOL_BLUETOOTH` is only available on Linux. Other constants
   are available if the corresponding protocol is supported.

.. data:: SO_L2CAP_*
          L2CAP_LM
          L2CAP_LM_*
          SO_RFCOMM_*
          RFCOMM_LM_*
          SO_SCO_*
          SO_BTH_*
          BT_*

   Used in the option name and value argument to the :meth:`~socket.setsockopt`
   and :meth:`~socket.getsockopt` methods of Bluetooth socket objects.

   :const:`!BT_*` and :const:`L2CAP_LM` are only available on Linux.
   :const:`!SO_BTH_*` are only available on Windows.
   Other constants may be available on Linux and various BSD platforms.

   .. versionadded:: 3.14

.. data:: HCI_FILTER
          HCI_TIME_STAMP
          HCI_DATA_DIR
          SO_HCI_EVT_FILTER
          SO_HCI_PKT_FILTER

   Option names for use with :const:`BTPROTO_HCI`.
   Availability and format of the option values depend on platform.

   .. versionchanged:: 3.14
      Added :const:`!SO_HCI_EVT_FILTER` and :const:`!SO_HCI_PKT_FILTER`
      on NetBSD and DragonFly BSD.
      Added :const:`!HCI_DATA_DIR` on FreeBSD, NetBSD and DragonFly BSD.

.. data:: HCI_DEV_NONE

   The ``device_id`` value used to create an HCI socket that isn't specific
   to a single Bluetooth adapter.

   .. availability:: Linux

   .. versionadded:: 3.14

.. data:: HCI_CHANNEL_RAW
          HCI_CHANNEL_USER
          HCI_CHANNEL_MONITOR
          HCI_CHANNEL_CONTROL
          HCI_CHANNEL_LOGGING

   Possible values for ``channel`` field in the :const:`BTPROTO_HCI` address.

   .. availability:: Linux

   .. versionadded:: 3.14

.. data:: AF_QIPCRTR

   Constant for Qualcomm's IPC router protocol, used to communicate with
   service providing remote processors.

   .. availability:: Linux >= 4.7.

.. data:: SCM_CREDS2
          LOCAL_CREDS
          LOCAL_CREDS_PERSISTENT

   LOCAL_CREDS and LOCAL_CREDS_PERSISTENT can be used
   with SOCK_DGRAM, SOCK_STREAM sockets, equivalent to
   Linux/DragonFlyBSD SO_PASSCRED, while LOCAL_CREDS
   sends the credentials at first read, LOCAL_CREDS_PERSISTENT
   sends for each read, SCM_CREDS2 must be then used for
   the latter for the message type.

   .. versionadded:: 3.11

   .. availability:: FreeBSD.

.. data:: SO_INCOMING_CPU

   Constant to optimize CPU locality, to be used in conjunction with
   :data:`SO_REUSEPORT`.

   .. versionadded:: 3.11

   .. availability:: Linux >= 3.9

.. data:: SO_REUSEPORT_LB

   Constant to enable duplicate address and port bindings with load balancing.

  .. versionadded:: 3.14

  .. availability:: FreeBSD >= 12.0

.. data:: AF_HYPERV
          HV_PROTOCOL_RAW
          HVSOCKET_CONNECT_TIMEOUT
          HVSOCKET_CONNECT_TIMEOUT_MAX
          HVSOCKET_CONNECTED_SUSPEND
          HVSOCKET_ADDRESS_FLAG_PASSTHRU
          HV_GUID_ZERO
          HV_GUID_WILDCARD
          HV_GUID_BROADCAST
          HV_GUID_CHILDREN
          HV_GUID_LOOPBACK
          HV_GUID_PARENT

   Constants for Windows Hyper-V sockets for host/guest communications.

   .. availability:: Windows.

   .. versionadded:: 3.12

.. _socket-ethernet-types:

.. data:: ETHERTYPE_ARP
          ETHERTYPE_IP
          ETHERTYPE_IPV6
          ETHERTYPE_VLAN

   `IEEE 802.3 protocol number
   <https://www.iana.org/assignments/ieee-802-numbers/ieee-802-numbers.txt>`_.
   constants.

   .. availability:: Linux, FreeBSD, macOS.

   .. versionadded:: 3.12

.. data:: SHUT_RD
          SHUT_WR
          SHUT_RDWR

   These constants are used by the :meth:`~socket.socket.shutdown` method of socket objects.

   .. availability:: not WASI.

Functions
^^^^^^^^^

Creating sockets
''''''''''''''''

The following functions all create :ref:`socket objects <socket-objects>`.


The :class:`socket <socket.socket>` class constructor creates a new socket
directly; see :ref:`socket-objects` for its parameters and full description.

.. function:: socketpair([family[, type[, proto]]])

   Build a pair of connected socket objects using the given address family, socket
   type, and protocol number.  Address family, socket type, and protocol number are
   as for the :func:`~socket.socket` function. The default family is :const:`AF_UNIX`
   if defined on the platform; otherwise, the default is :const:`AF_INET`.

   The newly created sockets are :ref:`non-inheritable <fd_inheritance>`.

   .. versionchanged:: 3.2
      The returned socket objects now support the whole socket API, rather
      than a subset.

   .. versionchanged:: 3.4
      The returned sockets are now non-inheritable.

   .. versionchanged:: 3.5
      Windows support added.


.. function:: create_connection(address, timeout=GLOBAL_DEFAULT, source_address=None, *, all_errors=False)

   Connect to a TCP service listening on the internet *address* (a 2-tuple
   ``(host, port)``), and return the socket object.  This is a higher-level
   function than :meth:`socket.connect`: if *host* is a non-numeric hostname,
   it will try to resolve it for both :data:`AF_INET` and :data:`AF_INET6`,
   and then try to connect to all possible addresses in turn until a
   connection succeeds.  This makes it easy to write clients that are
   compatible to both IPv4 and IPv6.

   Passing the optional *timeout* parameter will set the timeout on the
   socket instance before attempting to connect.  If no *timeout* is
   supplied, the global default timeout setting returned by
   :func:`getdefaulttimeout` is used.

   If supplied, *source_address* must be a 2-tuple ``(host, port)`` for the
   socket to bind to as its source address before connecting.  If host or port
   are '' or 0 respectively the OS default behavior will be used.

   When a connection cannot be created, an exception is raised. By default,
   it is the exception from the last address in the list. If *all_errors*
   is ``True``, it is an :exc:`ExceptionGroup` containing the errors of all
   attempts.

   .. versionchanged:: 3.2
      *source_address* was added.

   .. versionchanged:: 3.11
      *all_errors* was added.


.. function:: create_server(address, *, family=AF_INET, backlog=None, reuse_port=False, dualstack_ipv6=False)

   Convenience function which creates a TCP socket bound to *address* (a 2-tuple
   ``(host, port)``) and returns the socket object.

   *family* should be either :data:`AF_INET` or :data:`AF_INET6`.
   *backlog* is the queue size passed to :meth:`socket.listen`; if not specified
   , a default reasonable value is chosen.
   *reuse_port* dictates whether to set the :data:`SO_REUSEPORT` socket option.

   If *dualstack_ipv6* is true, *family* is :data:`AF_INET6` and the platform
   supports it the socket will be able to accept both IPv4 and IPv6 connections,
   else it will raise :exc:`ValueError`. Most POSIX platforms and Windows are
   supposed to support this functionality.
   When this functionality is enabled the address returned by
   :meth:`socket.getpeername` when an IPv4 connection occurs will be an IPv6
   address represented as an IPv4-mapped IPv6 address.
   If *dualstack_ipv6* is false it will explicitly disable this functionality
   on platforms that enable it by default (e.g. Linux).
   This parameter can be used in conjunction with :func:`has_dualstack_ipv6`:

   ::

     import socket

     addr = ("", 8080)  # all interfaces, port 8080
     if socket.has_dualstack_ipv6():
         s = socket.create_server(addr, family=socket.AF_INET6, dualstack_ipv6=True)
     else:
         s = socket.create_server(addr)

   .. note::
    On POSIX platforms the :data:`SO_REUSEADDR` socket option is set in order to
    immediately reuse previous sockets which were bound on the same *address*
    and remained in TIME_WAIT state.

   .. versionadded:: 3.8

.. function:: has_dualstack_ipv6()

   Return ``True`` if the platform supports creating a TCP socket which can
   handle both IPv4 and IPv6 connections.

   .. versionadded:: 3.8

.. function:: fromfd(fd, family, type, proto=0)

   Duplicate the file descriptor *fd* (an integer as returned by a file object's
   :meth:`~io.IOBase.fileno` method) and build a socket object from the result.  Address
   family, socket type and protocol number are as for the :func:`~socket.socket` function.
   The file descriptor should refer to a socket, but this is not checked ---
   subsequent operations on the object may fail if the file descriptor is invalid.
   This function is rarely needed, but can be used to get or set socket options on
   a socket passed to a program as standard input or output (such as a server
   started by the Unix inet daemon).  The socket is assumed to be in blocking mode.

   The newly created socket is :ref:`non-inheritable <fd_inheritance>`.

   .. versionchanged:: 3.4
      The returned socket is now non-inheritable.


.. function:: fromshare(data)

   Instantiate a socket from data obtained from the :meth:`socket.share`
   method.  The socket is assumed to be in blocking mode.

   .. availability:: Windows.

   .. versionadded:: 3.3


Other functions
'''''''''''''''

The :mod:`!socket` module also offers various network-related services:


.. function:: close(fd)

   Close a socket file descriptor. This is like :func:`os.close`, but for
   sockets. On some platforms (most notably Windows) :func:`os.close`
   does not work for socket file descriptors.

   .. versionadded:: 3.7

.. function:: getaddrinfo(host, port, family=AF_UNSPEC, type=0, proto=0, flags=0)

   This function wraps the C function ``getaddrinfo`` of the underlying system.

   Translate the *host*/*port* argument into a sequence of 5-tuples that contain
   all the necessary arguments for creating a socket connected to that service.
   *host* is a domain name, a string representation of an IPv4/v6 address
   or ``None``. *port* is a string service name such as ``'http'``, a numeric
   port number or ``None``.  By passing ``None`` as the value of *host*
   and *port*, you can pass ``NULL`` to the underlying C API.

   The *family*, *type* and *proto* arguments can be optionally specified
   in order to provide options and limit the list of addresses returned.
   Pass their default values (:data:`AF_UNSPEC`, 0, and 0, respectively)
   to not limit the results. See the note below for details.

   The *flags* argument can be one or several of the ``AI_*`` constants,
   and will influence how results are computed and returned.
   For example, :const:`AI_NUMERICHOST` will disable domain name resolution
   and will raise an error if *host* is a domain name.

   The function returns a list of 5-tuples with the following structure:

   ``(family, type, proto, canonname, sockaddr)``

   In these tuples, *family*, *type*, *proto* are all integers and are
   meant to be passed to the :func:`~socket.socket` function.  *canonname* will be
   a string representing the canonical name of the *host* if
   :const:`AI_CANONNAME` is part of the *flags* argument; else *canonname*
   will be empty.  *sockaddr* is a tuple describing a socket address, whose
   format depends on the returned *family* and flags Python was compiled with,
   and is meant to be passed to the :meth:`socket.connect` method.

   *sockaddr* can be one of the following:

   * a ``(address, port)`` 2-tuple for :const:`AF_INET`
   * a ``(address, port, flowinfo, scope_id)`` 4-tuple for :const:`AF_INET6` if
     Python was compiled with ``--enable-ipv6`` (the default)
   * a 2-tuple containing raw data for :const:`AF_INET6` if Python was
     compiled with ``--disable-ipv6``

   .. note::

      If you intend to use results from :func:`!getaddrinfo` to create a socket
      (rather than, for example, retrieve *canonname*),
      consider limiting the results by *type* (e.g. :data:`SOCK_STREAM` or
      :data:`SOCK_DGRAM`) and/or *proto* (e.g. :data:`IPPROTO_TCP` or
      :data:`IPPROTO_UDP`) that your application can handle.

      The behavior with default values of *family*, *type*, *proto*
      and *flags* is system-specific.

      Many systems (for example, most Linux configurations) will return a sorted
      list of all matching addresses.
      These addresses should generally be tried in order until a connection succeeds
      (possibly tried in parallel, for example, using a `Happy Eyeballs`_ algorithm).
      In these cases, limiting the *type* and/or *proto* can help eliminate
      unsuccessful or unusable connection attempts.

      Some systems will, however, only return a single address.
      (For example, this was reported on Solaris and AIX configurations.)
      On these systems, limiting the *type* and/or *proto* helps ensure that
      this address is usable.

   .. audit-event:: socket.getaddrinfo host,port,family,type,protocol socket.getaddrinfo

   The following example fetches address information for a hypothetical TCP
   connection to ``example.org`` on port 80 (results may differ on your
   system if IPv6 isn't enabled)::

      >>> socket.getaddrinfo("example.org", 80, proto=socket.IPPROTO_TCP)
      [(socket.AF_INET6, socket.SOCK_STREAM,
       6, '', ('2606:2800:220:1:248:1893:25c8:1946', 80, 0, 0)),
       (socket.AF_INET, socket.SOCK_STREAM,
       6, '', ('93.184.216.34', 80))]

   .. versionchanged:: 3.2
      parameters can now be passed using keyword arguments.

   .. versionchanged:: 3.7
      for IPv6 multicast addresses, string representing an address will not
      contain ``%scope_id`` part.

.. _Happy Eyeballs: https://en.wikipedia.org/wiki/Happy_Eyeballs

.. function:: getfqdn([name])

   Return a fully qualified domain name for *name*. If *name* is omitted or empty,
   it is interpreted as the local host.  To find the fully qualified name, the
   hostname returned by :func:`gethostbyaddr` is checked, followed by aliases for the
   host, if available.  The first name which includes a period is selected.  In
   case no fully qualified domain name is available and *name* was provided,
   it is returned unchanged.  If *name* was empty or equal to ``'0.0.0.0'``,
   the hostname from :func:`gethostname` is returned.


.. function:: gethostbyname(hostname)

   Translate a host name to IPv4 address format.  The IPv4 address is returned as a
   string, such as  ``'100.50.200.5'``.  If the host name is an IPv4 address itself
   it is returned unchanged.  See :func:`gethostbyname_ex` for a more complete
   interface. :func:`gethostbyname` does not support IPv6 name resolution, and
   :func:`getaddrinfo` should be used instead for IPv4/v6 dual stack support.

   .. audit-event:: socket.gethostbyname hostname socket.gethostbyname

   .. availability:: not WASI.


.. function:: gethostbyname_ex(hostname)

   Translate a host name to IPv4 address format, extended interface. Return a
   3-tuple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the host's
   primary host name, *aliaslist* is a (possibly
   empty) list of alternative host names for the same address, and *ipaddrlist* is
   a list of IPv4 addresses for the same interface on the same host (often but not
   always a single address). :func:`gethostbyname_ex` does not support IPv6 name
   resolution, and :func:`getaddrinfo` should be used instead for IPv4/v6 dual
   stack support.

   .. audit-event:: socket.gethostbyname hostname socket.gethostbyname_ex

   .. availability:: not WASI.


.. function:: gethostname()

   Return a string containing the hostname of the machine where  the Python
   interpreter is currently executing.

   .. audit-event:: socket.gethostname "" socket.gethostname

   Note: :func:`gethostname` doesn't always return the fully qualified domain
   name; use :func:`getfqdn` for that.

   .. availability:: not WASI.


.. function:: gethostbyaddr(ip_address)

   Return a 3-tuple ``(hostname, aliaslist, ipaddrlist)`` where *hostname* is the
   primary host name responding to the given *ip_address*, *aliaslist* is a
   (possibly empty) list of alternative host names for the same address, and
   *ipaddrlist* is a list of IPv4/v6 addresses for the same interface on the same
   host (most likely containing only a single address). To find the fully qualified
   domain name, use the function :func:`getfqdn`. :func:`gethostbyaddr` supports
   both IPv4 and IPv6.

   .. audit-event:: socket.gethostbyaddr ip_address socket.gethostbyaddr

   .. availability:: not WASI.


.. function:: getnameinfo(sockaddr, flags)

   Translate a socket address *sockaddr* into a 2-tuple ``(host, port)``. Depending
   on the settings of *flags*, the result can contain a fully qualified domain name
   or numeric address representation in *host*.  Similarly, *port* can contain a
   string port name or a numeric port number.

   For IPv6 addresses, ``%scope_id`` is appended to the host part if *sockaddr*
   contains meaningful *scope_id*. Usually this happens for multicast addresses.

   For more information about *flags* you can consult :manpage:`getnameinfo(3)`.

   .. audit-event:: socket.getnameinfo sockaddr socket.getnameinfo

   .. availability:: not WASI.


.. function:: getprotobyname(protocolname)

   Translate an internet protocol name (for example, ``'icmp'``) to a constant
   suitable for passing as the (optional) third argument to the :func:`~socket.socket`
   function.  This is usually only needed for sockets opened in "raw" mode
   (:const:`SOCK_RAW`); for the normal socket modes, the correct protocol is chosen
   automatically if the protocol is omitted or zero.

   .. availability:: not WASI.


.. function:: getservbyname(servicename[, protocolname])

   Translate an internet service name and protocol name to a port number for that
   service.  The optional protocol name, if given, should be ``'tcp'`` or
   ``'udp'``, otherwise any protocol will match.

   .. audit-event:: socket.getservbyname servicename,protocolname socket.getservbyname

   .. availability:: not WASI.


.. function:: getservbyport(port[, protocolname])

   Translate an internet port number and protocol name to a service name for that
   service.  The optional protocol name, if given, should be ``'tcp'`` or
   ``'udp'``, otherwise any protocol will match.

   .. audit-event:: socket.getservbyport port,protocolname socket.getservbyport

   .. availability:: not WASI.


.. function:: ntohl(x)

   Convert 32-bit positive integers from network to host byte order.  On machines
   where the host byte order is the same as network byte order, this is a no-op;
   otherwise, it performs a 4-byte swap operation.


.. function:: ntohs(x)

   Convert 16-bit positive integers from network to host byte order.  On machines
   where the host byte order is the same as network byte order, this is a no-op;
   otherwise, it performs a 2-byte swap operation.

   .. versionchanged:: 3.10
      Raises :exc:`OverflowError` if *x* does not fit in a 16-bit unsigned
      integer.


.. function:: htonl(x)

   Convert 32-bit positive integers from host to network byte order.  On machines
   where the host byte order is the same as network byte order, this is a no-op;
   otherwise, it performs a 4-byte swap operation.


.. function:: htons(x)

   Convert 16-bit positive integers from host to network byte order.  On machines
   where the host byte order is the same as network byte order, this is a no-op;
   otherwise, it performs a 2-byte swap operation.

   .. versionchanged:: 3.10
      Raises :exc:`OverflowError` if *x* does not fit in a 16-bit unsigned
      integer.


.. function:: inet_aton(ip_string)

   Convert an IPv4 address from dotted-quad string format (for example,
   '123.45.67.89') to 32-bit packed binary format, as a bytes object four characters in
   length.  This is useful when conversing with a program that uses the standard C
   library and needs objects of type :c:struct:`in_addr`, which is the C type
   for the 32-bit packed binary this function returns.

   :func:`inet_aton` also accepts strings with less than three dots; see the
   Unix manual page :manpage:`inet(3)` for details.

   If the IPv4 address string passed to this function is invalid,
   :exc:`OSError` will be raised. Note that exactly what is valid depends on
   the underlying C implementation of :c:func:`inet_aton`.

   :func:`inet_aton` does not support IPv6, and :func:`inet_pton` should be used
   instead for IPv4/v6 dual stack support.


.. function:: inet_ntoa(packed_ip)

   Convert a 32-bit packed IPv4 address (a :term:`bytes-like object` four
   bytes in length) to its standard dotted-quad string representation (for example,
   '123.45.67.89').  This is useful when conversing with a program that uses the
   standard C library and needs objects of type :c:struct:`in_addr`, which
   is the C type for the 32-bit packed binary data this function takes as an
   argument.

   If the byte sequence passed to this function is not exactly 4 bytes in
   length, :exc:`OSError` will be raised. :func:`inet_ntoa` does not
   support IPv6, and :func:`inet_ntop` should be used instead for IPv4/v6 dual
   stack support.

   .. versionchanged:: 3.5
      Writable :term:`bytes-like object` is now accepted.


.. function:: inet_pton(address_family, ip_string)

   Convert an IP address from its family-specific string format to a packed,
   binary format. :func:`inet_pton` is useful when a library or network protocol
   calls for an object of type :c:struct:`in_addr` (similar to
   :func:`inet_aton`) or :c:struct:`in6_addr`.

   Supported values for *address_family* are currently :const:`AF_INET` and
   :const:`AF_INET6`. If the IP address string *ip_string* is invalid,
   :exc:`OSError` will be raised. Note that exactly what is valid depends on
   both the value of *address_family* and the underlying implementation of
   :c:func:`inet_pton`.

   .. availability:: Unix, Windows.

   .. versionchanged:: 3.4
      Windows support added


.. function:: inet_ntop(address_family, packed_ip)

   Convert a packed IP address (a :term:`bytes-like object` of some number of
   bytes) to its standard, family-specific string representation (for
   example, ``'7.10.0.5'`` or ``'5aef:2b::8'``).
   :func:`inet_ntop` is useful when a library or network protocol returns an
   object of type :c:struct:`in_addr` (similar to :func:`inet_ntoa`) or
   :c:struct:`in6_addr`.

   Supported values for *address_family* are currently :const:`AF_INET` and
   :const:`AF_INET6`. If the bytes object *packed_ip* is not the correct
   length for the specified address family, :exc:`ValueError` will be raised.
   :exc:`OSError` is raised for errors from the call to :func:`inet_ntop`.

   .. availability:: Unix, Windows.

   .. versionchanged:: 3.4
      Windows support added

   .. versionchanged:: 3.5
      Writable :term:`bytes-like object` is now accepted.


..
   XXX: Are sendmsg(), recvmsg() and CMSG_*() available on any
   non-Unix platforms?  The old (obsolete?) 4.2BSD form of the
   interface, in which struct msghdr has no msg_control or
   msg_controllen members, is not currently supported.

.. function:: CMSG_LEN(length)

   Return the total length, without trailing padding, of an ancillary
   data item with associated data of the given *length*.  This value
   can often be used as the buffer size for :meth:`~socket.recvmsg` to
   receive a single item of ancillary data, but :rfc:`3542` requires
   portable applications to use :func:`CMSG_SPACE` and thus include
   space for padding, even when the item will be the last in the
   buffer.  Raises :exc:`OverflowError` if *length* is outside the
   permissible range of values.

   .. availability:: Unix, not WASI.

      Most Unix platforms.

   .. versionadded:: 3.3


.. function:: CMSG_SPACE(length)

   Return the buffer size needed for :meth:`~socket.recvmsg` to
   receive an ancillary data item with associated data of the given
   *length*, along with any trailing padding.  The buffer space needed
   to receive multiple items is the sum of the :func:`CMSG_SPACE`
   values for their associated data lengths.  Raises
   :exc:`OverflowError` if *length* is outside the permissible range
   of values.

   Note that some systems might support ancillary data without
   providing this function.  Also note that setting the buffer size
   using the results of this function may not precisely limit the
   amount of ancillary data that can be received, since additional
   data may be able to fit into the padding area.

   .. availability:: Unix, not WASI.

      most Unix platforms.

   .. versionadded:: 3.3


.. function:: getdefaulttimeout()

   Return the default timeout in seconds (float) for new socket objects. A value
   of ``None`` indicates that new socket objects have no timeout. When the socket
   module is first imported, the default is ``None``.


.. function:: setdefaulttimeout(timeout)

   Set the default timeout in seconds (real number) for new socket objects.  When
   the socket module is first imported, the default is ``None``.  See
   :meth:`~socket.settimeout` for possible values and their respective
   meanings.

   .. versionchanged:: 3.15
      Accepts any real number, not only integer or float.


.. function:: sethostname(name)

   Set the machine's hostname to *name*.  This will raise an
   :exc:`OSError` if you don't have enough rights.

   .. audit-event:: socket.sethostname name socket.sethostname

   .. availability:: Unix, not Android.

   .. versionadded:: 3.3


.. function:: if_nameindex()

   Return a list of network interface information
   (index int, name string) tuples.
   :exc:`OSError` if the system call fails.

   .. availability:: Unix, Windows, not WASI.

   .. versionadded:: 3.3

   .. versionchanged:: 3.8
      Windows support was added.

   .. note::

      On Windows network interfaces have different names in different contexts
      (all names are examples):

      * UUID: ``{FB605B73-AAC2-49A6-9A2F-25416AEA0573}``
      * name: ``ethernet_32770``
      * friendly name: ``vEthernet (nat)``
      * description: ``Hyper-V Virtual Ethernet Adapter``

      This function returns names of the second form from the list, ``ethernet_32770``
      in this example case.


.. function:: if_nametoindex(if_name)

   Return a network interface index number corresponding to an
   interface name.
   :exc:`OSError` if no interface with the given name exists.

   .. availability:: Unix, Windows, not WASI.

   .. versionadded:: 3.3

   .. versionchanged:: 3.8
      Windows support was added.

   .. seealso::
      "Interface name" is a name as documented in :func:`if_nameindex`.


.. function:: if_indextoname(if_index)

   Return a network interface name corresponding to an
   interface index number.
   :exc:`OSError` if no interface with the given index exists.

   .. availability:: Unix, Windows, not WASI.

   .. versionadded:: 3.3

   .. versionchanged:: 3.8
      Windows support was added.

   .. seealso::
      "Interface name" is a name as documented in :func:`if_nameindex`.


.. function:: send_fds(sock, buffers, fds[, flags[, address]])

   Send the list of file descriptors *fds* over an :const:`AF_UNIX` socket *sock*.
   The *fds* parameter is a sequence of file descriptors.
   Consult :meth:`~socket.sendmsg` for the documentation of these parameters.

   .. availability:: Unix, not WASI.

      Unix platforms supporting :meth:`~socket.sendmsg`
      and :const:`SCM_RIGHTS` mechanism.

   .. versionadded:: 3.9


.. function:: recv_fds(sock, bufsize, maxfds[, flags])

   Receive up to *maxfds* file descriptors from an :const:`AF_UNIX` socket *sock*.
   Return ``(msg, list(fds), flags, addr)``.
   Consult :meth:`~socket.recvmsg` for the documentation of these parameters.

   .. availability:: Unix, not WASI.

      Unix platforms supporting :meth:`~socket.recvmsg`
      and :const:`SCM_RIGHTS` mechanism.

   .. versionadded:: 3.9

   .. note::

      Any truncated integers at the end of the list of file descriptors.


.. _socket-objects:

Socket Objects
--------------

.. class:: socket(family=AF_INET, type=SOCK_STREAM, proto=0, fileno=None)

   Create a new socket using the given address family, socket type and protocol
   number.  The address family should be :const:`AF_INET` (the default),
   :const:`AF_INET6`, :const:`AF_UNIX`, :const:`AF_CAN`, :const:`AF_PACKET`,
   or :const:`AF_RDS`. The socket type should be :const:`SOCK_STREAM` (the
   default), :const:`SOCK_DGRAM`, :const:`SOCK_RAW` or perhaps one of the other
   ``SOCK_`` constants. The protocol number is usually zero and may be omitted
   or in the case where the address family is :const:`AF_CAN` the protocol
   should be one of :const:`CAN_RAW`, :const:`CAN_BCM`, :const:`CAN_ISOTP` or
   :const:`CAN_J1939`.

   If *fileno* is specified, the values for *family*, *type*, and *proto* are
   auto-detected from the specified file descriptor.  Auto-detection can be
   overruled by calling the function with explicit *family*, *type*, or *proto*
   arguments.  This only affects how Python represents e.g. the return value
   of :meth:`socket.getpeername` but not the actual OS resource.  Unlike
   :func:`socket.fromfd`, *fileno* will return the same socket and not a
   duplicate. This may help close a detached socket using
   :meth:`socket.close`.

   The newly created socket is :ref:`non-inheritable <fd_inheritance>`.

   .. audit-event:: socket.__new__ self,family,type,protocol socket.socket

   .. versionchanged:: 3.3
      The AF_CAN family was added.
      The AF_RDS family was added.

   .. versionchanged:: 3.4
       The CAN_BCM protocol was added.

   .. versionchanged:: 3.4
      The returned socket is now non-inheritable.

   .. versionchanged:: 3.7
       The CAN_ISOTP protocol was added.

   .. versionchanged:: 3.7
      When :const:`SOCK_NONBLOCK` or :const:`SOCK_CLOEXEC`
      bit flags are applied to *type* they are cleared, and
      :attr:`socket.type` will not reflect them.  They are still passed
      to the underlying system ``socket()`` call.  Therefore,

      ::

          sock = socket.socket(
              socket.AF_INET,
              socket.SOCK_STREAM | socket.SOCK_NONBLOCK)

      will still create a non-blocking socket on OSes that support
      ``SOCK_NONBLOCK``, but ``sock.type`` will be set to
      ``socket.SOCK_STREAM``.

   .. versionchanged:: 3.9
       The CAN_J1939 protocol was added.

   .. versionchanged:: 3.10
       The IPPROTO_MPTCP protocol was added.

   Socket objects have the following methods.  Except for
   :meth:`~socket.makefile`, these correspond to Unix system calls applicable
   to sockets.

   .. versionchanged:: 3.2
      Support for the :term:`context manager` protocol was added.  Exiting the
      context manager is equivalent to calling :meth:`~socket.close`.


   .. method:: accept()

      Accept a connection. The socket must be bound to an address and listening for
      connections. The return value is a pair ``(conn, address)`` where *conn* is a
      *new* socket object usable to send and receive data on the connection, and
      *address* is the address bound to the socket on the other end of the connection.

      The newly created socket is :ref:`non-inheritable <fd_inheritance>`.

      .. versionchanged:: 3.4
         The socket is now non-inheritable.

      .. versionchanged:: 3.5
         If the system call is interrupted and the signal handler does not raise
         an exception, the method now retries the system call instead of raising
         an :exc:`InterruptedError` exception (see :pep:`475` for the rationale).


   .. method:: bind(address)

      Bind the socket to *address*.  The socket must not already be bound. The format
      of *address* depends on the address family --- see :ref:`socket-addresses`.

      .. audit-event:: socket.bind self,address socket.socket.bind

      .. availability:: not WASI.


   .. method:: close()

      Mark the socket closed.  The underlying system resource (e.g. a file
      descriptor) is also closed when all file objects from :meth:`makefile`
      are closed.  Once that happens, all future operations on the socket
      object will fail. The remote end will receive no more data (after
      queued data is flushed).

      Sockets are automatically closed when they are garbage-collected, but
      it is recommended to :meth:`close` them explicitly, or to use a
      :keyword:`with` statement around them.

      .. versionchanged:: 3.6
         :exc:`OSError` is now raised if an error occurs when the underlying
         :c:func:`!close` call is made.

      .. note::

         :meth:`close` releases the resource associated with a connection but
         does not necessarily close the connection immediately.  If you want
         to close the connection in a timely fashion, call :meth:`shutdown`
         before :meth:`close`.


   .. method:: connect(address)

      Connect to a remote socket at *address*. The format of *address* depends on the
      address family --- see :ref:`socket-addresses`.

      If the connection is interrupted by a signal, the method waits until the
      connection completes, or raises a :exc:`TimeoutError` on timeout, if the
      signal handler doesn't raise an exception and the socket is blocking or has
      a timeout. For non-blocking sockets, the method raises an
      :exc:`InterruptedError` exception if the connection is interrupted by a
      signal (or the exception raised by the signal handler).

      .. audit-event:: socket.connect self,address socket.socket.connect

      .. versionchanged:: 3.5
         The method now waits until the connection completes instead of raising an
         :exc:`InterruptedError` exception if the connection is interrupted by a
         signal, the signal handler doesn't raise an exception and the socket is
         blocking or has a timeout (see the :pep:`475` for the rationale).

      .. availability:: not WASI.


   .. method:: connect_ex(address)

      Like ``connect(address)``, but return an error indicator instead of raising an
      exception for errors returned by the C-level :c:func:`!connect` call (other
      problems, such as "host not found," can still raise exceptions).  The error
      indicator is ``0`` if the operation succeeded, otherwise the value of the
      :c:data:`errno` variable.  This is useful to support, for example, asynchronous
      connects.

      .. audit-event:: socket.connect self,address socket.socket.connect_ex

      .. availability:: not WASI.

   .. method:: detach()

      Put the socket object into closed state without actually closing the
      underlying file descriptor.  The file descriptor is returned, and can
      be reused for other purposes.

      .. versionadded:: 3.2


   .. method:: dup()

      Duplicate the socket.

      The newly created socket is :ref:`non-inheritable <fd_inheritance>`.

      .. versionchanged:: 3.4
         The socket is now non-inheritable.

      .. availability:: not WASI.


   .. method:: fileno()

      Return the socket's file descriptor (a small integer), or -1 on failure. This
      is useful with :func:`select.select`.

      Under Windows the small integer returned by this method cannot be used where a
      file descriptor can be used (such as :func:`os.fdopen`).  Unix does not have
      this limitation.

   .. method:: get_inheritable()

      Get the :ref:`inheritable flag <fd_inheritance>` of the socket's file
      descriptor or socket's handle: ``True`` if the socket can be inherited in
      child processes, ``False`` if it cannot.

      .. versionadded:: 3.4


   .. method:: getpeername()

      Return the remote address to which the socket is connected.  This is useful to
      find out the port number of a remote IPv4/v6 socket, for instance. The format
      of the address returned depends on the address family --- see :ref:`socket-addresses`.
      On some systems this function is not supported.


   .. method:: getsockname()

      Return the socket's own address.  This is useful to find out the port number of
      an IPv4/v6 socket, for instance. The format of the address returned depends on
      the address family --- see :ref:`socket-addresses`.


   .. method:: getsockopt(level, optname[, buflen])

      Return the value of the given socket option (see the Unix man page
      :manpage:`getsockopt(2)`).  The needed symbolic constants (:ref:`SO_\* etc. <socket-unix-constants>`)
      are defined in this module.  If *buflen* is absent, an integer option is assumed
      and its integer value is returned by the function.  If *buflen* is present, it
      specifies the maximum length of the buffer used to receive the option in, and
      this buffer is returned as a bytes object.  It is up to the caller to decode the
      contents of the buffer (see the optional built-in module :mod:`struct` for a way
      to decode C structures encoded as byte strings).

      .. availability:: not WASI.


   .. method:: getblocking()

      Return ``True`` if socket is in blocking mode, ``False`` if in
      non-blocking.

      This is equivalent to checking ``socket.gettimeout() != 0``.

      .. versionadded:: 3.7


   .. method:: gettimeout()

      Return the timeout in seconds (float) associated with socket operations,
      or ``None`` if no timeout is set.  This reflects the last call to
      :meth:`setblocking` or :meth:`settimeout`.


   .. method:: ioctl(control, option)

      The :meth:`ioctl` method is a limited interface to the WSAIoctl system
      interface.  Please refer to the `Win32 documentation
      <https://msdn.microsoft.com/en-us/library/ms741621%28VS.85%29.aspx>`_ for more
      information.

      On other platforms, the generic :func:`fcntl.fcntl` and :func:`fcntl.ioctl`
      functions may be used; they accept a socket object as their first argument.

      Currently only the following control codes are supported:
      ``SIO_RCVALL``, ``SIO_KEEPALIVE_VALS``, and ``SIO_LOOPBACK_FAST_PATH``.

      .. availability:: Windows

      .. versionchanged:: 3.6
         ``SIO_LOOPBACK_FAST_PATH`` was added.


   .. method:: listen([backlog])

      Enable a server to accept connections.  If *backlog* is specified, it must
      be at least 0 (if it is lower, it is set to 0); it specifies the number of
      unaccepted connections that the system will allow before refusing new
      connections. If not specified, a default reasonable value is chosen.

      .. availability:: not WASI.

      .. versionchanged:: 3.5
         The *backlog* parameter is now optional.


   .. method:: makefile(mode='r', buffering=None, *, encoding=None, \
                               errors=None, newline=None)

      .. index:: single: I/O control; buffering

      Return a :term:`file object` associated with the socket.  The exact returned
      type depends on the arguments given to :meth:`makefile`.  These arguments are
      interpreted the same way as by the built-in :func:`open` function, except
      the only supported *mode* values are ``'r'`` (default), ``'w'``, ``'b'``, or
      a combination of those.

      The socket must be in blocking mode; it can have a timeout, but the file
      object's internal buffer may end up in an inconsistent state if a timeout
      occurs.

      Closing the file object returned by :meth:`makefile` won't close the
      original socket unless all other file objects have been closed and
      :meth:`socket.close` has been called on the socket object.

      .. note::

         On Windows, the file-like object created by :meth:`makefile` cannot be
         used where a file object with a file descriptor is expected, such as the
         stream arguments of :meth:`subprocess.Popen`.


   .. method:: recv(bufsize[, flags])

      Receive data from the socket.  The return value is a bytes object representing the
      data received.  The maximum amount of data to be received at once is specified
      by *bufsize*. A returned empty bytes object indicates that the client has disconnected.
      See the Unix manual page :manpage:`recv(2)` for the meaning of the optional argument
      *flags*; it defaults to zero.

      .. versionchanged:: 3.5
         If the system call is interrupted and the signal handler does not raise
         an exception, the method now retries the system call instead of raising
         an :exc:`InterruptedError` exception (see :pep:`475` for the rationale).


   .. method:: recvfrom(bufsize[, flags])

      Receive data from the socket.  The return value is a pair ``(bytes, address)``
      where *bytes* is a bytes object representing the data received and *address* is the
      address of the socket sending the data.  See the Unix manual page
      :manpage:`recv(2)` for the meaning of the optional argument *flags*; it defaults
      to zero. The format of *address* depends on the address family --- see
      :ref:`socket-addresses`.

      .. versionchanged:: 3.5
         If the system call is interrupted and the signal handler does not raise
         an exception, the method now retries the system call instead of raising
         an :exc:`InterruptedError` exception (see :pep:`475` for the rationale).

      .. versionchanged:: 3.7
         For multicast IPv6 address, first item of *address* does not contain
         ``%scope_id`` part anymore. In order to get full IPv6 address use
         :func:`getnameinfo`.

   .. method:: recvmsg(bufsize[, ancbufsize[, flags]])

      Receive normal data (up to *bufsize* bytes) and ancillary data from
      the socket.  The *ancbufsize* argument sets the size in bytes of
      the internal buffer used to receive the ancillary data; it defaults
      to 0, meaning that no ancillary data will be received.  Appropriate
      buffer sizes for ancillary data can be calculated using
      :func:`CMSG_SPACE` or :func:`CMSG_LEN`, and items which do not fit
      into the buffer might be truncated or discarded.  The *flags*
      argument defaults to 0 and has the same meaning as for
      :meth:`recv`.

      The return value is a 4-tuple: ``(data, ancdata, msg_flags,
      address)``.  The *data* item is a :class:`bytes` object holding the
      non-ancillary data received.  The *ancdata* item is a list of zero
      or more tuples ``(cmsg_level, cmsg_type, cmsg_data)`` representing
      the ancillary data (control messages) received: *cmsg_level* and
      *cmsg_type* are integers specifying the protocol level and
      protocol-specific type respectively, and *cmsg_data* is a
      :class:`bytes` object holding the associated data.  The *msg_flags*
      item is the bitwise OR of various flags indicating conditions on
      the received message; see your system documentation for details.
      If the receiving socket is unconnected, *address* is the address of
      the sending socket, if available; otherwise, its value is
      unspecified.

      On some systems, :meth:`sendmsg` and :meth:`recvmsg` can be used to
      pass file descriptors between processes over an :const:`AF_UNIX`
      socket.  When this facility is used (it is often restricted to
      :const:`SOCK_STREAM` sockets), :meth:`recvmsg` will return, in its
      ancillary data, items of the form ``(socket.SOL_SOCKET,
      socket.SCM_RIGHTS, fds)``, where *fds* is a :class:`bytes` object
      representing the new file descriptors as a binary array of the
      native C :c:expr:`int` type.  If :meth:`recvmsg` raises an
      exception after the system call returns, it will first attempt to
      close any file descriptors received via this mechanism.

      Some systems do not indicate the truncated length of ancillary data
      items which have been only partially received.  If an item appears
      to extend beyond the end of the buffer, :meth:`recvmsg` will issue
      a :exc:`RuntimeWarning`, and will return the part of it which is
      inside the buffer provided it has not been truncated before the
      start of its associated data.

      On systems which support the :const:`!SCM_RIGHTS` mechanism, the
      following function will receive up to *maxfds* file descriptors,
      returning the message data and a list containing the descriptors
      (while ignoring unexpected conditions such as unrelated control
      messages being received).  See also :meth:`sendmsg`. ::

         import socket, array

         def recv_fds(sock, msglen, maxfds):
             fds = array.array("i")   # Array of ints
             msg, ancdata, flags, addr = sock.recvmsg(msglen, socket.CMSG_LEN(maxfds * fds.itemsize))
             for cmsg_level, cmsg_type, cmsg_data in ancdata:
                 if cmsg_level == socket.SOL_SOCKET and cmsg_type == socket.SCM_RIGHTS:
                     # Append data, ignoring any truncated integers at the end.
                     fds.frombytes(cmsg_data[:len(cmsg_data) - (len(cmsg_data) % fds.itemsize)])
             return msg, list(fds)

      .. availability:: Unix.

         Most Unix platforms.

      .. versionadded:: 3.3

      .. versionchanged:: 3.5
         If the system call is interrupted and the signal handler does not raise
         an exception, the method now retries the system call instead of raising
         an :exc:`InterruptedError` exception (see :pep:`475` for the rationale).


   .. method:: recvmsg_into(buffers[, ancbufsize[, flags]])

      Receive normal data and ancillary data from the socket, behaving as
      :meth:`recvmsg` would, but scatter the non-ancillary data into a
      series of buffers instead of returning a new bytes object.  The
      *buffers* argument must be an iterable of objects that export
      writable buffers (e.g. :class:`bytearray` objects); these will be
      filled with successive chunks of the non-ancillary data until it
      has all been written or there are no more buffers.  The operating
      system may set a limit (:func:`~os.sysconf` value ``SC_IOV_MAX``)
      on the number of buffers that can be used.  The *ancbufsize* and
      *flags* arguments have the same meaning as for :meth:`recvmsg`.

      The return value is a 4-tuple: ``(nbytes, ancdata, msg_flags,
      address)``, where *nbytes* is the total number of bytes of
      non-ancillary data written into the buffers, and *ancdata*,
      *msg_flags* and *address* are the same as for :meth:`recvmsg`.

      Example::

         >>> import socket
         >>> s1, s2 = socket.socketpair()
         >>> b1 = bytearray(b'----')
         >>> b2 = bytearray(b'0123456789')
         >>> b3 = bytearray(b'--------------')
         >>> s1.send(b'Mary had a little lamb')
         22
         >>> s2.recvmsg_into([b1, memoryview(b2)[2:9], b3])
         (22, [], 0, None)
         >>> [b1, b2, b3]
         [bytearray(b'Mary'), bytearray(b'01 had a 9'), bytearray(b'little lamb---')]

      .. availability:: Unix.

         Most Unix platforms.

      .. versionadded:: 3.3


   .. method:: recvfrom_into(buffer[, nbytes[, flags]])

      Receive data from the socket, writing it into *buffer* instead of creating a
      new bytestring.  The return value is a pair ``(nbytes, address)`` where *nbytes* is
      the number of bytes received and *address* is the address of the socket sending
      the data.  See the Unix manual page :manpage:`recv(2)` for the meaning of the
      optional argument *flags*; it defaults to zero. The format of *address*
      depends on the address family --- see :ref:`socket-addresses`.


   .. method:: recv_into(buffer[, nbytes[, flags]])

      Receive up to *nbytes* bytes from the socket, storing the data into a buffer
      rather than creating a new bytestring.  If *nbytes* is not specified (or 0),
      receive up to the size available in the given buffer.  Returns the number of
      bytes received.  See the Unix manual page :manpage:`recv(2)` for the meaning
      of the optional argument *flags*; it defaults to zero.


   .. method:: send(bytes[, flags])

      Send data to the socket.  The socket must be connected to a remote socket.  The
      optional *flags* argument has the same meaning as for :meth:`recv`.
      Returns the number of bytes sent. Applications are responsible for checking that
      all data has been sent; if only some of the data was transmitted, the
      application needs to attempt delivery of the remaining data. For further
      information on this topic, consult the :ref:`socket-howto`.

      .. versionchanged:: 3.5
         If the system call is interrupted and the signal handler does not raise
         an exception, the method now retries the system call instead of raising
         an :exc:`InterruptedError` exception (see :pep:`475` for the rationale).


   .. method:: sendall(bytes[, flags])

      Send data to the socket.  The socket must be connected to a remote socket.  The
      optional *flags* argument has the same meaning as for :meth:`recv`.
      Unlike :meth:`send`, this method continues to send data from *bytes* until
      either all data has been sent or an error occurs.  ``None`` is returned on
      success.  On error, an exception is raised, and there is no way to determine how
      much data, if any, was successfully sent.

      .. versionchanged:: 3.5
         The socket timeout is no longer reset each time data is sent successfully.
         The socket timeout is now the maximum total duration to send all data.

      .. versionchanged:: 3.5
         If the system call is interrupted and the signal handler does not raise
         an exception, the method now retries the system call instead of raising
         an :exc:`InterruptedError` exception (see :pep:`475` for the rationale).


   .. method:: sendto(bytes, address)
               sendto(bytes, flags, address)

      Send data to the socket.  The socket should not be connected to a remote socket,
      since the destination socket is specified by *address*.  The optional *flags*
      argument has the same meaning as for :meth:`recv`.  Return the number of
      bytes sent. The format of *address* depends on the address family --- see
      :ref:`socket-addresses`.

      .. audit-event:: socket.sendto self,address socket.socket.sendto

      .. versionchanged:: 3.5
         If the system call is interrupted and the signal handler does not raise
         an exception, the method now retries the system call instead of raising
         an :exc:`InterruptedError` exception (see :pep:`475` for the rationale).


   .. method:: sendmsg(buffers[, ancdata[, flags[, address]]])

      Send normal and ancillary data to the socket, gathering the
      non-ancillary data from a series of buffers and concatenating it
      into a single message.  The *buffers* argument specifies the
      non-ancillary data as an iterable of
      :term:`bytes-like objects <bytes-like object>`
      (e.g. :class:`bytes` objects); the operating system may set a limit
      (:func:`~os.sysconf` value ``SC_IOV_MAX``) on the number of buffers
      that can be used.  The *ancdata* argument specifies the ancillary
      data (control messages) as an iterable of zero or more tuples
      ``(cmsg_level, cmsg_type, cmsg_data)``, where *cmsg_level* and
      *cmsg_type* are integers specifying the protocol level and
      protocol-specific type respectively, and *cmsg_data* is a
      bytes-like object holding the associated data.  Note that
      some systems (in particular, systems without :func:`CMSG_SPACE`)
      might support sending only one control message per call.  The
      *flags* argument defaults to 0 and has the same meaning as for
      :meth:`send`.  If *address* is supplied and not ``None``, it sets a
      destination address for the message.  The return value is the
      number of bytes of non-ancillary data sent.

      The following function sends the list of file descriptors *fds*
      over an :const:`AF_UNIX` socket, on systems which support the
      :const:`!SCM_RIGHTS` mechanism.  See also :meth:`recvmsg`. ::

         import socket, array

         def send_fds(sock, msg, fds):
             return sock.sendmsg([msg], [(socket.SOL_SOCKET, socket.SCM_RIGHTS, array.array("i", fds))])

      .. availability:: Unix, not WASI.

         Most Unix platforms.

      .. audit-event:: socket.sendmsg self,address socket.socket.sendmsg

      .. versionadded:: 3.3

      .. versionchanged:: 3.5
         If the system call is interrupted and the signal handler does not raise
         an exception, the method now retries the system call instead of raising
         an :exc:`InterruptedError` exception (see :pep:`475` for the rationale).

   .. method:: sendmsg_afalg([msg], *, op[, iv[, assoclen[, flags]]])

      Specialized version of :meth:`~socket.sendmsg` for :const:`AF_ALG` socket.
      Set mode, IV, AEAD associated data length and flags for :const:`AF_ALG` socket.

      .. availability:: Linux >= 2.6.38.

      .. versionadded:: 3.6

   .. method:: sendfile(file, offset=0, count=None)

      Send a file until EOF is reached by using high-performance
      :mod:`os.sendfile` and return the total number of bytes which were sent.
      *file* must be a regular file object opened in binary mode. If
      :mod:`os.sendfile` is not available (e.g. Windows) or *file* is not a
      regular file :meth:`send` will be used instead. *offset* tells from where to
      start reading the file. If specified, *count* is the total number of bytes
      to transmit as opposed to sending the file until EOF is reached. File
      position is updated on return or also in case of error in which case
      :meth:`file.tell() <io.IOBase.tell>` can be used to figure out the number of
      bytes which were sent. The socket must be of :const:`SOCK_STREAM` type.
      Non-blocking sockets are not supported.

      .. versionadded:: 3.5

   .. method:: set_inheritable(inheritable)

      Set the :ref:`inheritable flag <fd_inheritance>` of the socket's file
      descriptor or socket's handle.

      .. versionadded:: 3.4


   .. method:: setblocking(flag)

      Set blocking or non-blocking mode of the socket: if *flag* is false, the
      socket is set to non-blocking, else to blocking mode.

      This method is a shorthand for certain :meth:`~socket.settimeout` calls:

      * ``sock.setblocking(True)`` is equivalent to ``sock.settimeout(None)``

      * ``sock.setblocking(False)`` is equivalent to ``sock.settimeout(0.0)``

      .. versionchanged:: 3.7
         The method no longer applies :const:`SOCK_NONBLOCK` flag on
         :attr:`socket.type`.


   .. method:: settimeout(value)

      Set a timeout on blocking socket operations.  The *value* argument can be a
      nonnegative real number expressing seconds, or ``None``.
      If a non-zero value is given, subsequent socket operations will raise a
      :exc:`timeout` exception if the timeout period *value* has elapsed before
      the operation has completed.  If zero is given, the socket is put in
      non-blocking mode. If ``None`` is given, the socket is put in blocking mode.

      For further information, please consult the :ref:`notes on socket timeouts <socket-timeouts>`.

      .. versionchanged:: 3.7
         The method no longer toggles :const:`SOCK_NONBLOCK` flag on
         :attr:`socket.type`.

      .. versionchanged:: 3.15
         Accepts any real number, not only integer or float.


   .. method:: setsockopt(level, optname, value: int | Buffer)
               setsockopt(level, optname, None, optlen: int)

      .. index:: pair: module; struct

      Set the value of the given socket option (see the Unix manual page
      :manpage:`setsockopt(2)`).  The needed symbolic constants are defined in this
      module (:ref:`!SO_\* etc. <socket-unix-constants>`).  The value can be an integer,
      ``None`` or a :term:`bytes-like object` representing a buffer. In the latter
      case it is up to the caller to ensure that the bytestring contains the
      proper bits (see the optional built-in module :mod:`struct` for a way to
      encode C structures as bytestrings). When *value* is set to ``None``,
      *optlen* argument is required. It's equivalent to calling :c:func:`!setsockopt` C
      function with ``optval=NULL`` and ``optlen=optlen``.

      .. versionchanged:: 3.5
         Writable :term:`bytes-like object` is now accepted.

      .. versionchanged:: 3.6
         setsockopt(level, optname, None, optlen: int) form added.

      .. availability:: not WASI.


   .. method:: shutdown(how)

      Shut down one or both halves of the connection.  If *how* is :const:`SHUT_RD`,
      further receives are disallowed.  If *how* is :const:`SHUT_WR`, further sends
      are disallowed.  If *how* is :const:`SHUT_RDWR`, further sends and receives are
      disallowed.

      .. availability:: not WASI.


   .. method:: share(process_id)

      Duplicate a socket and prepare it for sharing with a target process.  The
      target process must be provided with *process_id*.  The resulting bytes object
      can then be passed to the target process using some form of interprocess
      communication and the socket can be recreated there using :func:`fromshare`.
      Once this method has been called, it is safe to close the socket since
      the operating system has already duplicated it for the target process.

      .. availability:: Windows.

      .. versionadded:: 3.3


   Note that there are no methods :meth:`!read` or :meth:`!write`; use
   :meth:`~socket.recv` and :meth:`~socket.send` without *flags* argument instead.

   Socket objects also have these (read-only) attributes that correspond to the
   values given to the :class:`~socket.socket` constructor.


   .. attribute:: family

      The socket family.


   .. attribute:: type

      The socket type.


   .. attribute:: proto

      The socket protocol.


.. class:: SocketType

   The base class of the :class:`~socket.socket` type, re-exported from
   :mod:`!_socket`.  An instance check such as
   ``isinstance(socket(...), SocketType)`` is true, but ``SocketType`` is not
   the same as ``type(socket(...))``, which is :class:`~socket.socket` itself.


.. _socket-timeouts:

Notes on socket timeouts
------------------------

A socket object can be in one of three modes: blocking, non-blocking, or
timeout.  Sockets are by default always created in blocking mode, but this
can be changed by calling :func:`setdefaulttimeout`.

* In *blocking mode*, operations block until complete or the system returns
  an error (such as connection timed out).

* In *non-blocking mode*, operations fail (with an error that is unfortunately
  system-dependent) if they cannot be completed immediately: functions from the
  :mod:`select` module can be used to know when and whether a socket is available
  for reading or writing.

* In *timeout mode*, operations fail if they cannot be completed within the
  timeout specified for the socket (they raise a :exc:`timeout` exception)
  or if the system returns an error.

.. note::
   At the operating system level, sockets in *timeout mode* are internally set
   in non-blocking mode.  Also, the blocking and timeout modes are shared between
   file descriptors and socket objects that refer to the same network endpoint.
   This implementation detail can have visible consequences if e.g. you decide
   to use the :meth:`~socket.fileno` of a socket.

Timeouts and the ``connect`` method
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

The :meth:`~socket.connect` operation is also subject to the timeout
setting, and in general it is recommended to call :meth:`~socket.settimeout`
before calling :meth:`~socket.connect` or pass a timeout parameter to
:meth:`create_connection`.  However, the system network stack may also
return a connection timeout error of its own regardless of any Python socket
timeout setting.

Timeouts and the ``accept`` method
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

If :func:`getdefaulttimeout` is not :const:`None`, sockets returned by
the :meth:`~socket.accept` method inherit that timeout.  Otherwise, the
behaviour depends on settings of the listening socket:

* if the listening socket is in *blocking mode* or in *timeout mode*,
  the socket returned by :meth:`~socket.accept` is in *blocking mode*;

* if the listening socket is in *non-blocking mode*, whether the socket
  returned by :meth:`~socket.accept` is in blocking or non-blocking mode
  is operating system-dependent.  If you want to ensure cross-platform
  behaviour, it is recommended you manually override this setting.


.. _socket-example:

Example
-------

Here are four minimal example programs using the TCP/IP protocol: a server that
echoes all data that it receives back (servicing only one client), and a client
using it.  Note that a server must perform the sequence :func:`~socket.socket`,
:meth:`~socket.bind`, :meth:`~socket.listen`, :meth:`~socket.accept` (possibly
repeating the :meth:`~socket.accept` to service more than one client), while a
client only needs the sequence :func:`~socket.socket`, :meth:`~socket.connect`.  Also
note that the server does not :meth:`~socket.sendall`/:meth:`~socket.recv` on
the socket it is listening on but on the new socket returned by
:meth:`~socket.accept`.

The first two examples support IPv4 only. ::

   # Echo server program
   import socket

   HOST = ''                 # Symbolic name meaning all available interfaces
   PORT = 50007              # Arbitrary non-privileged port
   with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
       s.bind((HOST, PORT))
       s.listen(1)
       conn, addr = s.accept()
       with conn:
           print('Connected by', addr)
           while True:
               data = conn.recv(1024)
               if not data: break
               conn.sendall(data)

::

   # Echo client program
   import socket

   HOST = 'daring.cwi.nl'    # The remote host
   PORT = 50007              # The same port as used by the server
   with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
       s.connect((HOST, PORT))
       s.sendall(b'Hello, world')
       data = s.recv(1024)
   print('Received', repr(data))

The next two examples are identical to the above two, but support both IPv4 and
IPv6. The server side will listen to the first address family available (it
should listen to both instead). On most of IPv6-ready systems, IPv6 will take
precedence and the server may not accept IPv4 traffic. The client side will try
to connect to all the addresses returned as a result of the name resolution, and
sends traffic to the first one connected successfully. ::

   # Echo server program
   import socket
   import sys

   HOST = None               # Symbolic name meaning all available interfaces
   PORT = 50007              # Arbitrary non-privileged port
   s = None
   for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC,
                                 socket.SOCK_STREAM, 0, socket.AI_PASSIVE):
       af, socktype, proto, canonname, sa = res
       try:
           s = socket.socket(af, socktype, proto)
       except OSError as msg:
           s = None
           continue
       try:
           s.bind(sa)
           s.listen(1)
       except OSError as msg:
           s.close()
           s = None
           continue
       break
   if s is None:
       print('could not open socket')
       sys.exit(1)
   conn, addr = s.accept()
   with conn:
       print('Connected by', addr)
       while True:
           data = conn.recv(1024)
           if not data: break
           conn.send(data)

::

   # Echo client program
   import socket
   import sys

   HOST = 'daring.cwi.nl'    # The remote host
   PORT = 50007              # The same port as used by the server
   s = None
   for res in socket.getaddrinfo(HOST, PORT, socket.AF_UNSPEC, socket.SOCK_STREAM):
       af, socktype, proto, canonname, sa = res
       try:
           s = socket.socket(af, socktype, proto)
       except OSError as msg:
           s = None
           continue
       try:
           s.connect(sa)
       except OSError as msg:
           s.close()
           s = None
           continue
       break
   if s is None:
       print('could not open socket')
       sys.exit(1)
   with s:
       s.sendall(b'Hello, world')
       data = s.recv(1024)
   print('Received', repr(data))

The next example shows how to write a very simple network sniffer with raw
sockets on Windows. The example requires administrator privileges to modify
the interface::

   import socket

   # the public network interface
   HOST = socket.gethostbyname(socket.gethostname())

   # create a raw socket and bind it to the public interface
   s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
   s.bind((HOST, 0))

   # Include IP headers
   s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)

   # receive all packets
   s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)

   # receive a packet
   print(s.recvfrom(65565))

   # disabled promiscuous mode
   s.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)

The next example shows how to use the socket interface to communicate to a CAN
network using the raw socket protocol. To use CAN with the broadcast
manager protocol instead, open a socket with::

    socket.socket(socket.AF_CAN, socket.SOCK_DGRAM, socket.CAN_BCM)

After binding (:const:`CAN_RAW`) or connecting (:const:`CAN_BCM`) the socket, you
can use the :meth:`socket.send` and :meth:`socket.recv` operations (and
their counterparts) on the socket object as usual.

This last example might require special privileges::

   import socket
   import struct


   # CAN frame packing/unpacking (see 'struct can_frame' in <linux/can.h>)

   can_frame_fmt = "=IB3x8s"
   can_frame_size = struct.calcsize(can_frame_fmt)

   def build_can_frame(can_id, data):
       can_dlc = len(data)
       data = data.ljust(8, b'\x00')
       return struct.pack(can_frame_fmt, can_id, can_dlc, data)

   def dissect_can_frame(frame):
       can_id, can_dlc, data = struct.unpack(can_frame_fmt, frame)
       return (can_id, can_dlc, data[:can_dlc])


   # create a raw socket and bind it to the 'vcan0' interface
   s = socket.socket(socket.AF_CAN, socket.SOCK_RAW, socket.CAN_RAW)
   s.bind(('vcan0',))

   while True:
       cf, addr = s.recvfrom(can_frame_size)

       print('Received: can_id=%x, can_dlc=%x, data=%s' % dissect_can_frame(cf))

       try:
           s.send(cf)
       except OSError:
           print('Error sending CAN frame')

       try:
           s.send(build_can_frame(0x01, b'\x01\x02\x03'))
       except OSError:
           print('Error sending CAN frame')

Running an example several times with too small delay between executions, could
lead to this error::

   OSError: [Errno 98] Address already in use

This is because the previous execution has left the socket in a ``TIME_WAIT``
state, and can't be immediately reused.

There is a :mod:`!socket` flag to set, in order to prevent this,
:const:`socket.SO_REUSEADDR`::

   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
   s.bind((HOST, PORT))

the :data:`SO_REUSEADDR` flag tells the kernel to reuse a local socket in
``TIME_WAIT`` state, without waiting for its natural timeout to expire.


.. seealso::

   For an introduction to socket programming (in C), see the following papers:

   - *An Introductory 4.3BSD Interprocess Communication Tutorial*, by Stuart Sechrest

   - *An Advanced 4.3BSD Interprocess Communication Tutorial*, by Samuel J.  Leffler et
     al,

   both in the UNIX Programmer's Manual, Supplementary Documents 1 (sections
   PS1:7 and PS1:8).  The platform-specific reference material for the various
   socket-related system calls are also a valuable source of information on the
   details of socket semantics.  For Unix, refer to the manual pages; for Windows,
   see the WinSock (or Winsock 2) specification.  For IPv6-ready APIs, readers may
   want to refer to :rfc:`3493` titled Basic Socket Interface Extensions for IPv6.
