: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` 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 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 require 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 require 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 ``(bdaddr, psm)`` where ``bdaddr`` is
    the Bluetooth address as a string and ``psm`` is an integer.

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

  - :const:`BTPROTO_HCI` accepts ``(device_id,)`` where ``device_id`` is
    either an integer or a string with the Bluetooth address of the
    interface. (This depends on your OS; NetBSD and DragonFlyBSD expect
    a Bluetooth address while everything else expects an integer.)

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

  - :const:`BTPROTO_SCO` accepts ``bdaddr`` where ``bdaddr`` is a
    :class:`bytes` object containing the Bluetooth address in a
    string format. (ex. ``b'12:23:34:45:56:67'``) This protocol is not
    supported under FreeBSD.

- :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 packets 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.
    Value must be in network-byte-order.
  - *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`.  If the :const:`AF_UNIX` constant is not
   defined then this protocol is unsupported.  More constants may be available
   depending on the system.


.. 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`.  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

.. 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:`setsockopt` and :meth:`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
      On Windows, ``TCP_FASTOPEN``, ``TCP_KEEPCNT`` appear if run-time Windows
      supports.

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

      On Windows, ``TCP_KEEPIDLE``, ``TCP_KEEPINTVL`` appear if run-time Windows
      supports.

   .. 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``.

.. 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.

.. 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:: 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:: HCI_FILTER
          HCI_TIME_STAMP
          HCI_DATA_DIR

   For use with :const:`BTPROTO_HCI`. :const:`HCI_FILTER` is not
   available for NetBSD or DragonFlyBSD. :const:`HCI_TIME_STAMP` and
   :const:`HCI_DATA_DIR` are not available for FreeBSD, NetBSD, or
   DragonFlyBSD.

.. 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:: 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


Functions
^^^^^^^^^

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

The following functions all create :ref:`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.

.. 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` function above. 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 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:`fileno` method) and build a socket object from the result.  Address
   family, socket type and protocol number are as for the :func:`.socket` function
   above. 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


.. data:: SocketType

   This is a Python type object that represents the socket object type. It is the
   same as ``type(socket(...))``.


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 noticeable Windows) :func:`os.close`
   does not work for socket file descriptors.

   .. versionadded:: 3.7

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

   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 narrow the list of addresses returned.  Passing zero as a
   value for each of these arguments selects the full range of results.
   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` 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* (a ``(address, port)`` 2-tuple for
   :const:`AF_INET`, a ``(address, port, flowinfo, scope_id)`` 4-tuple for
   :const:`AF_INET6`), and is meant to be passed to the :meth:`socket.connect`
   method.

   .. 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.

.. 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`
   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 Emscripten, 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 Emscripten, 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 (float) 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.


.. 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.

   .. 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 Emscripten, 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 Emscripten, 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 Emscripten, 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:`sendmsg` for the documentation of these parameters.

   .. availability:: Unix, Windows, not Emscripten, 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:`recvmsg` for the documentation of these parameters.

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

      Unix platforms supporting :meth:`~socket.sendmsg`
      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
--------------

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:: socket.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:: socket.bind(address)

   Bind the socket to *address*.  The socket must not already be bound. (The format
   of *address* depends on the address family --- see above.)

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

   .. availability:: not WASI.


.. method:: socket.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:: socket.connect(address)

   Connect to a remote socket at *address*. (The format of *address* depends on the
   address family --- see above.)

   If the connection is interrupted by a signal, the method waits until the
   connection completes, or raise 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:: socket.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:: socket.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:: socket.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:: socket.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:: socket.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:: socket.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 above.)  On some
   systems this function is not supported.


.. method:: socket.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 above.)


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

   Return the value of the given socket option (see the Unix man page
   :manpage:`getsockopt(2)`).  The needed symbolic constants (:const:`SO_\*` etc.)
   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:: socket.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:: socket.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:: socket.ioctl(control, option)

   :platform: Windows

   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``.

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

.. method:: socket.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:: socket.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'`` and ``'b'``.

   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:: socket.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*.  See the Unix manual page :manpage:`recv(2)` for the meaning of
   the optional argument *flags*; it defaults to zero.

   .. note::

      For best match with hardware and network realities, the value of  *bufsize*
      should be a relatively small power of 2, for example, 4096.

   .. 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:: socket.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 above.)

   .. 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:: socket.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:: socket.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:: socket.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 above.)


.. method:: socket.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:: socket.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` above.
   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:: socket.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` above.
   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:: socket.sendto(bytes, address)
            socket.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` above.  Return the number of
   bytes sent. (The format of *address* depends on the address family --- see
   above.)

   .. 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:: socket.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:: socket.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:: socket.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:: socket.set_inheritable(inheritable)

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

   .. versionadded:: 3.4


.. method:: socket.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:: socket.settimeout(value)

   Set a timeout on blocking socket operations.  The *value* argument can be a
   nonnegative floating point 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`.


.. method:: socket.setsockopt(level, optname, value: int)
.. method:: socket.setsockopt(level, optname, value: buffer)
   :noindex:
.. method:: socket.setsockopt(level, optname, None, optlen: int)
   :noindex:

   .. 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 the
   :mod:`socket` module (:const:`SO_\*` etc.).  The value can be an integer,
   ``None`` or a :term:`bytes-like object` representing a buffer. In the later
   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 call :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:: socket.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:: socket.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:: socket.family

   The socket family.


.. attribute:: socket.type

   The socket type.


.. attribute:: socket.proto

   The socket protocol.



.. _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`,
: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`, :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 the all 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.
