# <!-- rdoc-file=ext/socket/socket.c -->
# Class `Socket` provides access to the underlying operating system socket
# implementations.  It can be used to provide more operating system specific
# functionality than the protocol-specific socket classes.
#
# The constants defined under Socket::Constants are also defined under Socket.
# For example, Socket::AF_INET is usable as well as Socket::Constants::AF_INET.
# See Socket::Constants for the list of constants.
#
# ### What's a socket?
#
# Sockets are endpoints of a bidirectional communication channel. Sockets can
# communicate within a process, between processes on the same machine or between
# different machines.  There are many types of socket: TCPSocket, UDPSocket or
# UNIXSocket for example.
#
# Sockets have their own vocabulary:
#
# **domain:** The family of protocols:
# *   Socket::PF_INET
# *   Socket::PF_INET6
# *   Socket::PF_UNIX
# *   etc.
#
# **type:** The type of communications between the two endpoints, typically
# *   Socket::SOCK_STREAM
# *   Socket::SOCK_DGRAM.
#
# **protocol:** Typically *zero*. This may be used to identify a variant of a
# protocol.
#
# **hostname:** The identifier of a network interface:
# *   a string (hostname, IPv4 or IPv6 address or `broadcast` which specifies a
#     broadcast address)
# *   a zero-length string which specifies INADDR_ANY
# *   an integer (interpreted as binary address in host byte order).
#
# ### Quick start
#
# Many of the classes, such as TCPSocket, UDPSocket or UNIXSocket, ease the use
# of sockets comparatively to the equivalent C programming interface.
#
# Let's create an internet socket using the IPv4 protocol in a C-like manner:
#
#     require 'socket'
#
#     s = Socket.new Socket::AF_INET, Socket::SOCK_STREAM
#     s.connect Socket.pack_sockaddr_in(80, 'example.com')
#
# You could also use the TCPSocket class:
#
#     s = TCPSocket.new 'example.com', 80
#
# A simple server might look like this:
#
#     require 'socket'
#
#     server = TCPServer.new 2000 # Server bound to port 2000
#
#     loop do
#       client = server.accept    # Wait for a client to connect
#       client.puts "Hello !"
#       client.puts "Time is #{Time.now}"
#       client.close
#     end
#
# A simple client may look like this:
#
#     require 'socket'
#
#     s = TCPSocket.new 'localhost', 2000
#
#     while line = s.gets # Read lines from socket
#       puts line         # and print them
#     end
#
#     s.close             # close socket when done
#
# ### Exception Handling
#
# Ruby's Socket implementation raises exceptions based on the error generated by
# the system dependent implementation.  This is why the methods are documented
# in a way that isolate Unix-based system exceptions from Windows based
# exceptions. If more information on a particular exception is needed, please
# refer to the Unix manual pages or the Windows WinSock reference.
#
# ### Convenience methods
#
# Although the general way to create socket is Socket.new, there are several
# methods of socket creation for most cases.
#
# TCP client socket
# :   Socket.tcp, TCPSocket.open
#
# TCP server socket
# :   Socket.tcp_server_loop, TCPServer.open
#
# UNIX client socket
# :   Socket.unix, UNIXSocket.open
#
# UNIX server socket
# :   Socket.unix_server_loop, UNIXServer.open
#
#
# ### Documentation by
#
# *   Zach Dennis
# *   Sam Roberts
# *   *Programming Ruby* from The Pragmatic Bookshelf.
#
# Much material in this documentation is taken with permission from *Programming
# Ruby* from The Pragmatic Bookshelf.
#
class Socket < BasicSocket
  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - accept_loop(*sockets) { |socket, client_addrinfo| ... }
  # -->
  # yield socket and client address for each a connection accepted via given
  # sockets.
  #
  # The arguments are a list of sockets. The individual argument should be a
  # socket or an array of sockets.
  #
  # This method yields the block sequentially. It means that the next connection
  # is not accepted until the block returns. So concurrent mechanism, thread for
  # example, should be used to service multiple clients at a time.
  #
  def self.accept_loop: (*_ToIO sockets) { (Socket) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.getaddrinfo(nodename, servname[, family[, socktype[, protocol[, flags[, reverse_lookup]]]]]) => array
  # -->
  # Obtains address information for *nodename*:*servname*.
  #
  # Note that Addrinfo.getaddrinfo provides the same functionality in an object
  # oriented style.
  #
  # *family* should be an address family such as: :INET, :INET6, etc.
  #
  # *socktype* should be a socket type such as: :STREAM, :DGRAM, :RAW, etc.
  #
  # *protocol* should be a protocol defined in the family, and defaults to 0 for
  # the family.
  #
  # *flags* should be bitwise OR of Socket::AI_* constants.
  #
  #     Socket.getaddrinfo("www.ruby-lang.org", "http", nil, :STREAM)
  #     #=> [["AF_INET", 80, "carbon.ruby-lang.org", "221.186.184.68", 2, 1, 6]] # PF_INET/SOCK_STREAM/IPPROTO_TCP
  #
  #     Socket.getaddrinfo("localhost", nil)
  #     #=> [["AF_INET", 0, "localhost", "127.0.0.1", 2, 1, 6],  # PF_INET/SOCK_STREAM/IPPROTO_TCP
  #     #    ["AF_INET", 0, "localhost", "127.0.0.1", 2, 2, 17], # PF_INET/SOCK_DGRAM/IPPROTO_UDP
  #     #    ["AF_INET", 0, "localhost", "127.0.0.1", 2, 3, 0]]  # PF_INET/SOCK_RAW/IPPROTO_IP
  #
  # *reverse_lookup* directs the form of the third element, and has to be one of
  # below.  If *reverse_lookup* is omitted, the default value is `nil`.
  #
  #     +true+, +:hostname+:  hostname is obtained from numeric address using reverse lookup, which may take a time.
  #     +false+, +:numeric+:  hostname is the same as numeric address.
  #     +nil+:              obey to the current +do_not_reverse_lookup+ flag.
  #
  # If Addrinfo object is preferred, use Addrinfo.getaddrinfo.
  #
  def self.getaddrinfo: (String peer, String | Integer | nil protocol, ?Integer | Symbol | nil family, ?Integer | Symbol | nil socktype, ?Integer | Symbol | nil protocol, ?Integer | nil flags) -> [ String, Integer, String, String, Integer, Integer, Integer ]
                      | (String? peer, String | Integer protocol, ?Integer | Symbol | nil family, ?Integer | Symbol | nil socktype, ?Integer | Symbol | nil protocol, ?Integer | nil flags) -> [ String, Integer, String, String, Integer, Integer, Integer ]

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.gethostbyaddr(address_string [, address_family]) => hostent
  # -->
  # Use Addrinfo#getnameinfo instead. This method is deprecated for the following
  # reasons:
  #
  # *   Uncommon address representation: 4/16-bytes binary string to represent
  #     IPv4/IPv6 address.
  # *   gethostbyaddr() may take a long time and it may block other threads. (GVL
  #     cannot be released since gethostbyname() is not thread safe.)
  # *   This method uses gethostbyname() function already removed from POSIX.
  #
  # This method obtains the host information for *address*.
  #
  #     p Socket.gethostbyaddr([221,186,184,68].pack("CCCC"))
  #     #=> ["carbon.ruby-lang.org", [], 2, "\xDD\xBA\xB8D"]
  #
  #     p Socket.gethostbyaddr([127,0,0,1].pack("CCCC"))
  #     ["localhost", [], 2, "\x7F\x00\x00\x01"]
  #     p Socket.gethostbyaddr(([0]*15+[1]).pack("C"*16))
  #     #=> ["localhost", ["ip6-localhost", "ip6-loopback"], 10,
  #          "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"]
  #
  def self.gethostbyaddr: (String ip) -> [ String, Array[String], Integer, String ]

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.gethostbyname(hostname) => [official_hostname, alias_hostnames, address_family, *address_list]
  # -->
  # Use Addrinfo.getaddrinfo instead. This method is deprecated for the following
  # reasons:
  #
  # *   The 3rd element of the result is the address family of the first address.
  #     The address families of the rest of the addresses are not returned.
  # *   Uncommon address representation: 4/16-bytes binary string to represent
  #     IPv4/IPv6 address.
  # *   gethostbyname() may take a long time and it may block other threads. (GVL
  #     cannot be released since gethostbyname() is not thread safe.)
  # *   This method uses gethostbyname() function already removed from POSIX.
  #
  # This method obtains the host information for *hostname*.
  #
  #     p Socket.gethostbyname("hal") #=> ["localhost", ["hal"], 2, "\x7F\x00\x00\x01"]
  #
  def self.gethostbyname: (String name) -> [ String, Array[String], Integer, String ]

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.gethostname => hostname
  # -->
  # Returns the hostname.
  #
  #     p Socket.gethostname #=> "hal"
  #
  # Note that it is not guaranteed to be able to convert to IP address using
  # gethostbyname, getaddrinfo, etc. If you need local IP address, use
  # Socket.ip_address_list.
  #
  def self.gethostname: () -> String

  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - Socket.getifaddrs => [ifaddr1, ...]
  # -->
  # Returns an array of interface addresses. An element of the array is an
  # instance of Socket::Ifaddr.
  #
  # This method can be used to find multicast-enabled interfaces:
  #
  #     pp Socket.getifaddrs.reject {|ifaddr|
  #       !ifaddr.addr.ip? || (ifaddr.flags & Socket::IFF_MULTICAST == 0)
  #     }.map {|ifaddr| [ifaddr.name, ifaddr.ifindex, ifaddr.addr] }
  #     #=> [["eth0", 2, #<Addrinfo: 221.186.184.67>],
  #     #    ["eth0", 2, #<Addrinfo: fe80::216:3eff:fe95:88bb%eth0>]]
  #
  # Example result on GNU/Linux:
  #     pp Socket.getifaddrs
  #     #=> [#<Socket::Ifaddr lo UP,LOOPBACK,RUNNING,0x10000 PACKET[protocol=0 lo hatype=772 HOST hwaddr=00:00:00:00:00:00]>,
  #     #    #<Socket::Ifaddr eth0 UP,BROADCAST,RUNNING,MULTICAST,0x10000 PACKET[protocol=0 eth0 hatype=1 HOST hwaddr=00:16:3e:95:88:bb] broadcast=PACKET[protocol=0 eth0 hatype=1 HOST hwaddr=ff:ff:ff:ff:ff:ff]>,
  #     #    #<Socket::Ifaddr sit0 NOARP PACKET[protocol=0 sit0 hatype=776 HOST hwaddr=00:00:00:00]>,
  #     #    #<Socket::Ifaddr lo UP,LOOPBACK,RUNNING,0x10000 127.0.0.1 netmask=255.0.0.0>,
  #     #    #<Socket::Ifaddr eth0 UP,BROADCAST,RUNNING,MULTICAST,0x10000 221.186.184.67 netmask=255.255.255.240 broadcast=221.186.184.79>,
  #     #    #<Socket::Ifaddr lo UP,LOOPBACK,RUNNING,0x10000 ::1 netmask=ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>,
  #     #    #<Socket::Ifaddr eth0 UP,BROADCAST,RUNNING,MULTICAST,0x10000 fe80::216:3eff:fe95:88bb%eth0 netmask=ffff:ffff:ffff:ffff::>]
  #
  # Example result on FreeBSD:
  #     pp Socket.getifaddrs
  #     #=> [#<Socket::Ifaddr usbus0 UP,0x10000 LINK[usbus0]>,
  #     #    #<Socket::Ifaddr re0 UP,BROADCAST,RUNNING,MULTICAST,0x800 LINK[re0 3a:d0:40:9a:fe:e8]>,
  #     #    #<Socket::Ifaddr re0 UP,BROADCAST,RUNNING,MULTICAST,0x800 10.250.10.18 netmask=255.255.255.? (7 bytes for 16 bytes sockaddr_in) broadcast=10.250.10.255>,
  #     #    #<Socket::Ifaddr re0 UP,BROADCAST,RUNNING,MULTICAST,0x800 fe80:2::38d0:40ff:fe9a:fee8 netmask=ffff:ffff:ffff:ffff::>,
  #     #    #<Socket::Ifaddr re0 UP,BROADCAST,RUNNING,MULTICAST,0x800 2001:2e8:408:10::12 netmask=UNSPEC>,
  #     #    #<Socket::Ifaddr plip0 POINTOPOINT,MULTICAST,0x800 LINK[plip0]>,
  #     #    #<Socket::Ifaddr lo0 UP,LOOPBACK,RUNNING,MULTICAST LINK[lo0]>,
  #     #    #<Socket::Ifaddr lo0 UP,LOOPBACK,RUNNING,MULTICAST ::1 netmask=ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff>,
  #     #    #<Socket::Ifaddr lo0 UP,LOOPBACK,RUNNING,MULTICAST fe80:4::1 netmask=ffff:ffff:ffff:ffff::>,
  #     #    #<Socket::Ifaddr lo0 UP,LOOPBACK,RUNNING,MULTICAST 127.0.0.1 netmask=255.?.?.? (5 bytes for 16 bytes sockaddr_in)>]
  #
  def self.getifaddrs: () -> Array[Socket::Ifaddr]

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.getnameinfo(sockaddr [, flags]) => [hostname, servicename]
  # -->
  # Obtains name information for *sockaddr*.
  #
  # *sockaddr* should be one of follows.
  # *   packed sockaddr string such as Socket.sockaddr_in(80, "127.0.0.1")
  # *   3-elements array such as ["AF_INET", 80, "127.0.0.1"]
  # *   4-elements array such as ["AF_INET", 80, ignored, "127.0.0.1"]
  #
  # *flags* should be bitwise OR of Socket::NI_* constants.
  #
  # Note: The last form is compatible with IPSocket#addr and IPSocket#peeraddr.
  #
  #     Socket.getnameinfo(Socket.sockaddr_in(80, "127.0.0.1"))       #=> ["localhost", "www"]
  #     Socket.getnameinfo(["AF_INET", 80, "127.0.0.1"])              #=> ["localhost", "www"]
  #     Socket.getnameinfo(["AF_INET", 80, "localhost", "127.0.0.1"]) #=> ["localhost", "www"]
  #
  # If Addrinfo object is preferred, use Addrinfo#getnameinfo.
  #
  def self.getnameinfo: ([ String, Integer, String ]) -> Array[String]
                      | ([ String, Integer, String, String ]) -> Array[String]
                      | (String sockaddr) -> Array[String]

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.getservbyname(service_name)                => port_number
  #   - Socket.getservbyname(service_name, protocol_name) => port_number
  # -->
  # Obtains the port number for *service_name*.
  #
  # If *protocol_name* is not given, "tcp" is assumed.
  #
  #     Socket.getservbyname("smtp")          #=> 25
  #     Socket.getservbyname("shell")         #=> 514
  #     Socket.getservbyname("syslog", "udp") #=> 514
  #
  def self.getservbyname: (String service_proto) -> Integer
                        | (String service_proto, String layer4_proto) -> Integer

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.getservbyport(port [, protocol_name]) => service
  # -->
  # Obtains the port number for *port*.
  #
  # If *protocol_name* is not given, "tcp" is assumed.
  #
  #     Socket.getservbyport(80)         #=> "www"
  #     Socket.getservbyport(514, "tcp") #=> "shell"
  #     Socket.getservbyport(514, "udp") #=> "syslog"
  #
  def self.getservbyport: (Integer service_port) -> String
                        | (Integer service_port, String layer4_proto) -> String

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.ip_address_list => array
  # -->
  # Returns local IP addresses as an array.
  #
  # The array contains Addrinfo objects.
  #
  #     pp Socket.ip_address_list
  #     #=> [#<Addrinfo: 127.0.0.1>,
  #          #<Addrinfo: 192.168.0.128>,
  #          #<Addrinfo: ::1>,
  #          ...]
  #
  def self.ip_address_list: () -> Array[Addrinfo]

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.sockaddr_in(port, host)      => sockaddr
  #   - Socket.pack_sockaddr_in(port, host) => sockaddr
  # -->
  # Packs *port* and *host* as an AF_INET/AF_INET6 sockaddr string.
  #
  #     Socket.sockaddr_in(80, "127.0.0.1")
  #     #=> "\x02\x00\x00P\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
  #
  #     Socket.sockaddr_in(80, "::1")
  #     #=> "\n\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
  #
  def self.pack_sockaddr_in: (Integer port, String ip) -> String

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.sockaddr_un(path)      => sockaddr
  #   - Socket.pack_sockaddr_un(path) => sockaddr
  # -->
  # Packs *path* as an AF_UNIX sockaddr string.
  #
  #     Socket.sockaddr_un("/tmp/sock") #=> "\x01\x00/tmp/sock\x00\x00..."
  #
  def self.pack_sockaddr_un: (String sockpath) -> String

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.pair(domain, type, protocol)       => [socket1, socket2]
  #   - Socket.socketpair(domain, type, protocol) => [socket1, socket2]
  # -->
  # Creates a pair of sockets connected each other.
  #
  # *domain* should be a communications domain such as: :INET, :INET6, :UNIX, etc.
  #
  # *socktype* should be a socket type such as: :STREAM, :DGRAM, :RAW, etc.
  #
  # *protocol* should be a protocol defined in the domain, defaults to 0 for the
  # domain.
  #
  #     s1, s2 = Socket.pair(:UNIX, :STREAM, 0)
  #     s1.send "a", 0
  #     s1.send "b", 0
  #     s1.close
  #     p s2.recv(10) #=> "ab"
  #     p s2.recv(10) #=> ""
  #     p s2.recv(10) #=> ""
  #
  #     s1, s2 = Socket.pair(:UNIX, :DGRAM, 0)
  #     s1.send "a", 0
  #     s1.send "b", 0
  #     p s2.recv(10) #=> "a"
  #     p s2.recv(10) #=> "b"
  #
  def self.pair: (Symbol sockdomain, Symbol socktype, Integer protocol) -> [ instance, instance ]

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.sockaddr_in(port, host)      => sockaddr
  #   - Socket.pack_sockaddr_in(port, host) => sockaddr
  # -->
  # Packs *port* and *host* as an AF_INET/AF_INET6 sockaddr string.
  #
  #     Socket.sockaddr_in(80, "127.0.0.1")
  #     #=> "\x02\x00\x00P\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
  #
  #     Socket.sockaddr_in(80, "::1")
  #     #=> "\n\x00\x00P\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
  #
  def self.sockaddr_in: (Integer port, String ip) -> String

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.sockaddr_un(path)      => sockaddr
  #   - Socket.pack_sockaddr_un(path) => sockaddr
  # -->
  # Packs *path* as an AF_UNIX sockaddr string.
  #
  #     Socket.sockaddr_un("/tmp/sock") #=> "\x01\x00/tmp/sock\x00\x00..."
  #
  def self.sockaddr_un: (String sockpath) -> String

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.pair(domain, type, protocol)       => [socket1, socket2]
  #   - Socket.socketpair(domain, type, protocol) => [socket1, socket2]
  # -->
  # Creates a pair of sockets connected each other.
  #
  # *domain* should be a communications domain such as: :INET, :INET6, :UNIX, etc.
  #
  # *socktype* should be a socket type such as: :STREAM, :DGRAM, :RAW, etc.
  #
  # *protocol* should be a protocol defined in the domain, defaults to 0 for the
  # domain.
  #
  #     s1, s2 = Socket.pair(:UNIX, :STREAM, 0)
  #     s1.send "a", 0
  #     s1.send "b", 0
  #     s1.close
  #     p s2.recv(10) #=> "ab"
  #     p s2.recv(10) #=> ""
  #     p s2.recv(10) #=> ""
  #
  #     s1, s2 = Socket.pair(:UNIX, :DGRAM, 0)
  #     s1.send "a", 0
  #     s1.send "b", 0
  #     p s2.recv(10) #=> "a"
  #     p s2.recv(10) #=> "b"
  #
  def self.socketpair: (Symbol sockdomain, Symbol socktype, Integer protocol) -> [ instance, instance ]

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - Socket.tcp(host, port, local_host=nil, local_port=nil, [opts]) {|socket| ... }
  #   - Socket.tcp(host, port, local_host=nil, local_port=nil, [opts])
  # -->
  # creates a new socket object connected to host:port using TCP/IP.
  #
  # Starting from Ruby 3.4, this method operates according to the Happy Eyeballs
  # Version 2 ([RFC 8305](https://datatracker.ietf.org/doc/html/rfc8305))
  # algorithm by default.
  #
  # For details on Happy Eyeballs Version 2, see
  # [Socket.tcp_fast_fallback=](rdoc-ref:Socket.tcp_fast_fallback=).
  #
  # To make it behave the same as in Ruby 3.3 and earlier, explicitly specify the
  # option fast_fallback:false. Or, setting Socket.tcp_fast_fallback=false will
  # disable Happy Eyeballs Version 2 not only for this method but for all Socket
  # globally.
  #
  # If local_host:local_port is given, the socket is bound to it.
  #
  # The optional last argument *opts* is options represented by a hash. *opts* may
  # have following options:
  #
  # :resolv_timeout
  # :   Specifies the timeout in seconds from when the hostname resolution starts.
  #
  # :connect_timeout
  # :   This method sequentially attempts connecting to all candidate destination
  #     addresses.
  #     The `connect_timeout` specifies the timeout in seconds from the start of
  #     the connection attempt to the last candidate.
  #     By default, all connection attempts continue until the timeout occurs.
  #     When `fast_fallback:false` is explicitly specified,
  #     a timeout is set for each connection attempt and any connection attempt
  #     that exceeds its timeout will be canceled.
  #
  # :fast_fallback
  # :   Enables the Happy Eyeballs Version 2 algorithm (enabled by default).
  #
  #
  # If a block is given, the block is called with the socket. The value of the
  # block is returned. The socket is closed when this method returns.
  #
  # If no block is given, the socket is returned.
  #
  #     Socket.tcp("www.ruby-lang.org", 80) {|sock|
  #       sock.print "GET / HTTP/1.0\r\nHost: www.ruby-lang.org\r\n\r\n"
  #       sock.close_write
  #       puts sock.read
  #     }
  #
  def self.tcp: (String host, Integer port, ?String local_host, ?Integer local_port, ?resolv_timeout: Time::_Timeout, ?connect_timeout: Time::_Timeout) -> instance
              | (String host, Integer port, ?String local_host, ?Integer local_port, ?resolv_timeout: Time::_Timeout, ?connect_timeout: Time::_Timeout) { (instance) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - tcp_server_loop(host=nil, port) { |socket, client_addrinfo| ... }
  # -->
  # creates a TCP/IP server on *port* and calls the block for each connection
  # accepted. The block is called with a socket and a client_address as an
  # Addrinfo object.
  #
  # If *host* is specified, it is used with *port* to determine the server
  # addresses.
  #
  # The socket is **not** closed when the block returns. So application should
  # close it explicitly.
  #
  # This method calls the block sequentially. It means that the next connection is
  # not accepted until the block returns. So concurrent mechanism, thread for
  # example, should be used to service multiple clients at a time.
  #
  # Note that Addrinfo.getaddrinfo is used to determine the server socket
  # addresses. When Addrinfo.getaddrinfo returns two or more addresses, IPv4 and
  # IPv6 address for example, all of them are used. Socket.tcp_server_loop
  # succeeds if one socket can be used at least.
  #
  #     # Sequential echo server.
  #     # It services only one client at a time.
  #     Socket.tcp_server_loop(16807) {|sock, client_addrinfo|
  #       begin
  #         IO.copy_stream(sock, sock)
  #       ensure
  #         sock.close
  #       end
  #     }
  #
  #     # Threaded echo server
  #     # It services multiple clients at a time.
  #     # Note that it may accept connections too much.
  #     Socket.tcp_server_loop(16807) {|sock, client_addrinfo|
  #       Thread.new {
  #         begin
  #           IO.copy_stream(sock, sock)
  #         ensure
  #           sock.close
  #         end
  #       }
  #     }
  #
  def self.tcp_server_loop: (?String host, Integer port) { (instance, Addrinfo) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - tcp_server_sockets(host=nil, port) { |sockets| ... }
  # -->
  # creates TCP/IP server sockets for *host* and *port*. *host* is optional.
  #
  # If no block given, it returns an array of listening sockets.
  #
  # If a block is given, the block is called with the sockets. The value of the
  # block is returned. The socket is closed when this method returns.
  #
  # If *port* is 0, actual port number is chosen dynamically. However all sockets
  # in the result has same port number.
  #
  #     # tcp_server_sockets returns two sockets.
  #     sockets = Socket.tcp_server_sockets(1296)
  #     p sockets #=> [#<Socket:fd 3>, #<Socket:fd 4>]
  #
  #     # The sockets contains IPv6 and IPv4 sockets.
  #     sockets.each {|s| p s.local_address }
  #     #=> #<Addrinfo: [::]:1296 TCP>
  #     #   #<Addrinfo: 0.0.0.0:1296 TCP>
  #
  #     # IPv6 and IPv4 socket has same port number, 53114, even if it is chosen dynamically.
  #     sockets = Socket.tcp_server_sockets(0)
  #     sockets.each {|s| p s.local_address }
  #     #=> #<Addrinfo: [::]:53114 TCP>
  #     #   #<Addrinfo: 0.0.0.0:53114 TCP>
  #
  #     # The block is called with the sockets.
  #     Socket.tcp_server_sockets(0) {|sockets|
  #       p sockets #=> [#<Socket:fd 3>, #<Socket:fd 4>]
  #     }
  #
  def self.tcp_server_sockets: (?String host, Integer port) -> Array[TCPServer]
                             | (?String host, Integer port) { (Array[TCPServer]) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - Socket.udp_server_loop(port) {|msg, msg_src| ... }
  #   - Socket.udp_server_loop(host, port) {|msg, msg_src| ... }
  # -->
  # creates a UDP/IP server on *port* and calls the block for each message
  # arrived. The block is called with the message and its source information.
  #
  # This method allocates sockets internally using *port*. If *host* is specified,
  # it is used conjunction with *port* to determine the server addresses.
  #
  # The *msg* is a string.
  #
  # The *msg_src* is a Socket::UDPSource object. It is used for reply.
  #
  #     # UDP/IP echo server.
  #     Socket.udp_server_loop(9261) {|msg, msg_src|
  #       msg_src.reply msg
  #     }
  #
  def self.udp_server_loop: (?String host, Integer port) { (String, Socket::UDPSource) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - Socket.udp_server_loop_on(sockets) {|msg, msg_src| ... }
  # -->
  # Run UDP/IP server loop on the given sockets.
  #
  # The return value of Socket.udp_server_sockets is appropriate for the argument.
  #
  # It calls the block for each message received.
  #
  def self.udp_server_loop_on: (UDPSocket sockets) { (String, Socket::UDPSource) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - Socket.udp_server_recv(sockets) {|msg, msg_src| ... }
  # -->
  # Receive UDP/IP packets from the given *sockets*. For each packet received, the
  # block is called.
  #
  # The block receives *msg* and *msg_src*. *msg* is a string which is the payload
  # of the received packet. *msg_src* is a Socket::UDPSource object which is used
  # for reply.
  #
  # Socket.udp_server_loop can be implemented using this method as follows.
  #
  #     udp_server_sockets(host, port) {|sockets|
  #       loop {
  #         readable, _, _ = IO.select(sockets)
  #         udp_server_recv(readable) {|msg, msg_src| ... }
  #       }
  #     }
  #
  def self.udp_server_recv: (Array[UDPSocket] sockets) { (String, Socket::UDPSource) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - Socket.udp_server_sockets([host, ] port)
  # -->
  # Creates UDP/IP sockets for a UDP server.
  #
  # If no block given, it returns an array of sockets.
  #
  # If a block is given, the block is called with the sockets. The value of the
  # block is returned. The sockets are closed when this method returns.
  #
  # If *port* is zero, some port is chosen. But the chosen port is used for the
  # all sockets.
  #
  #     # UDP/IP echo server
  #     Socket.udp_server_sockets(0) {|sockets|
  #       p sockets.first.local_address.ip_port     #=> 32963
  #       Socket.udp_server_loop_on(sockets) {|msg, msg_src|
  #         msg_src.reply msg
  #       }
  #     }
  #
  def self.udp_server_sockets: (?String host, Integer port) { (UDPSocket) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - unix(path) { |socket| ... }
  # -->
  # creates a new socket connected to path using UNIX socket socket.
  #
  # If a block is given, the block is called with the socket. The value of the
  # block is returned. The socket is closed when this method returns.
  #
  # If no block is given, the socket is returned.
  #
  #     # talk to /tmp/sock socket.
  #     Socket.unix("/tmp/sock") {|sock|
  #       t = Thread.new { IO.copy_stream(sock, STDOUT) }
  #       IO.copy_stream(STDIN, sock)
  #       t.join
  #     }
  #
  def self.unix: (String path) -> UNIXSocket
               | (String path) { (UNIXSocket) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - unix_server_loop(path) { |socket, client_addrinfo| ... }
  # -->
  # creates a UNIX socket server on *path*. It calls the block for each socket
  # accepted.
  #
  # If *host* is specified, it is used with *port* to determine the server ports.
  #
  # The socket is **not** closed when the block returns. So application should
  # close it.
  #
  # This method deletes the socket file pointed by *path* at first if the file is
  # a socket file and it is owned by the user of the application. This is safe
  # only if the directory of *path* is not changed by a malicious user. So don't
  # use /tmp/malicious-users-directory/socket. Note that /tmp/socket and
  # /tmp/your-private-directory/socket is safe assuming that /tmp has sticky bit.
  #
  #     # Sequential echo server.
  #     # It services only one client at a time.
  #     Socket.unix_server_loop("/tmp/sock") {|sock, client_addrinfo|
  #       begin
  #         IO.copy_stream(sock, sock)
  #       ensure
  #         sock.close
  #       end
  #     }
  #
  def self.unix_server_loop: (String path) { (UNIXSocket, Addrinfo) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - unix_server_socket(path) { |s| ... }
  # -->
  # creates a UNIX server socket on *path*
  #
  # If no block given, it returns a listening socket.
  #
  # If a block is given, it is called with the socket and the block value is
  # returned. When the block exits, the socket is closed and the socket file is
  # removed.
  #
  #     socket = Socket.unix_server_socket("/tmp/s")
  #     p socket                  #=> #<Socket:fd 3>
  #     p socket.local_address    #=> #<Addrinfo: /tmp/s SOCK_STREAM>
  #
  #     Socket.unix_server_socket("/tmp/sock") {|s|
  #       p s                     #=> #<Socket:fd 3>
  #       p s.local_address       #=> # #<Addrinfo: /tmp/sock SOCK_STREAM>
  #     }
  #
  def self.unix_server_socket: (String path) -> Socket
                             | (String path) { (Socket) -> void } -> void

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.unpack_sockaddr_in(sockaddr) => [port, ip_address]
  # -->
  # Unpacks *sockaddr* into port and ip_address.
  #
  # *sockaddr* should be a string or an addrinfo for AF_INET/AF_INET6.
  #
  #     sockaddr = Socket.sockaddr_in(80, "127.0.0.1")
  #     p sockaddr #=> "\x02\x00\x00P\x7F\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00"
  #     p Socket.unpack_sockaddr_in(sockaddr) #=> [80, "127.0.0.1"]
  #
  def self.unpack_sockaddr_in: (String | Addrinfo sockaddr) -> [ Integer, String ]

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.unpack_sockaddr_un(sockaddr) => path
  # -->
  # Unpacks *sockaddr* into path.
  #
  # *sockaddr* should be a string or an addrinfo for AF_UNIX.
  #
  #     sockaddr = Socket.sockaddr_un("/tmp/sock")
  #     p Socket.unpack_sockaddr_un(sockaddr) #=> "/tmp/sock"
  #
  def self.unpack_sockaddr_un: (String path) -> String

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - socket.accept => [client_socket, client_addrinfo]
  # -->
  # Accepts a next connection. Returns a new Socket object and Addrinfo object.
  #
  #     serv = Socket.new(:INET, :STREAM, 0)
  #     serv.listen(5)
  #     c = Socket.new(:INET, :STREAM, 0)
  #     c.connect(serv.connect_address)
  #     p serv.accept #=> [#<Socket:fd 6>, #<Addrinfo: 127.0.0.1:48555 TCP>]
  #
  def accept: () -> [ Socket, Addrinfo ]

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - socket.accept_nonblock([options]) => [client_socket, client_addrinfo]
  # -->
  # Accepts an incoming connection using accept(2) after O_NONBLOCK is set for the
  # underlying file descriptor. It returns an array containing the accepted socket
  # for the incoming connection, *client_socket*, and an Addrinfo,
  # *client_addrinfo*.
  #
  # ### Example
  #     # In one script, start this first
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #     sockaddr = Socket.sockaddr_in(2200, 'localhost')
  #     socket.bind(sockaddr)
  #     socket.listen(5)
  #     begin # emulate blocking accept
  #       client_socket, client_addrinfo = socket.accept_nonblock
  #     rescue IO::WaitReadable, Errno::EINTR
  #       IO.select([socket])
  #       retry
  #     end
  #     puts "The client said, '#{client_socket.readline.chomp}'"
  #     client_socket.puts "Hello from script one!"
  #     socket.close
  #
  #     # In another script, start this second
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #     sockaddr = Socket.sockaddr_in(2200, 'localhost')
  #     socket.connect(sockaddr)
  #     socket.puts "Hello from script 2."
  #     puts "The server said, '#{socket.readline.chomp}'"
  #     socket.close
  #
  # Refer to Socket#accept for the exceptions that may be thrown if the call to
  # *accept_nonblock* fails.
  #
  # Socket#accept_nonblock may raise any error corresponding to accept(2) failure,
  # including Errno::EWOULDBLOCK.
  #
  # If the exception is Errno::EWOULDBLOCK, Errno::EAGAIN, Errno::ECONNABORTED or
  # Errno::EPROTO, it is extended by IO::WaitReadable. So IO::WaitReadable can be
  # used to rescue the exceptions for retrying accept_nonblock.
  #
  # By specifying a keyword argument *exception* to `false`, you can indicate that
  # accept_nonblock should not raise an IO::WaitReadable exception, but return the
  # symbol `:wait_readable` instead.
  #
  # ### See
  # *   Socket#accept
  #
  def accept_nonblock: (?exception: boolish) -> ([ Socket, Addrinfo ] | :wait_readable)

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - socket.bind(local_sockaddr) => 0
  # -->
  # Binds to the given local address.
  #
  # ### Parameter
  # *   `local_sockaddr` - the `struct` sockaddr contained in a string or an
  #     Addrinfo object
  #
  # ### Example
  #     require 'socket'
  #
  #     # use Addrinfo
  #     socket = Socket.new(:INET, :STREAM, 0)
  #     socket.bind(Addrinfo.tcp("127.0.0.1", 2222))
  #     p socket.local_address #=> #<Addrinfo: 127.0.0.1:2222 TCP>
  #
  #     # use struct sockaddr
  #     include Socket::Constants
  #     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
  #     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
  #     socket.bind( sockaddr )
  #
  # ### Unix-based Exceptions
  # On unix-based based systems the following system exceptions may be raised if
  # the call to *bind* fails:
  # *   Errno::EACCES - the specified *sockaddr* is protected and the current user
  #     does not have permission to bind to it
  # *   Errno::EADDRINUSE - the specified *sockaddr* is already in use
  # *   Errno::EADDRNOTAVAIL - the specified *sockaddr* is not available from the
  #     local machine
  # *   Errno::EAFNOSUPPORT - the specified *sockaddr* is not a valid address for
  #     the family of the calling `socket`
  # *   Errno::EBADF - the *sockaddr* specified is not a valid file descriptor
  # *   Errno::EFAULT - the *sockaddr* argument cannot be accessed
  # *   Errno::EINVAL - the `socket` is already bound to an address, and the
  #     protocol does not support binding to the new *sockaddr* or the `socket`
  #     has been shut down.
  # *   Errno::EINVAL - the address length is not a valid length for the address
  #     family
  # *   Errno::ENAMETOOLONG - the pathname resolved had a length which exceeded
  #     PATH_MAX
  # *   Errno::ENOBUFS - no buffer space is available
  # *   Errno::ENOSR - there were insufficient STREAMS resources available to
  #     complete the operation
  # *   Errno::ENOTSOCK - the `socket` does not refer to a socket
  # *   Errno::EOPNOTSUPP - the socket type of the `socket` does not support
  #     binding to an address
  #
  # On unix-based based systems if the address family of the calling `socket` is
  # Socket::AF_UNIX the follow exceptions may be raised if the call to *bind*
  # fails:
  # *   Errno::EACCES - search permission is denied for a component of the prefix
  #     path or write access to the `socket` is denied
  # *   Errno::EDESTADDRREQ - the *sockaddr* argument is a null pointer
  # *   Errno::EISDIR - same as Errno::EDESTADDRREQ
  # *   Errno::EIO - an i/o error occurred
  # *   Errno::ELOOP - too many symbolic links were encountered in translating the
  #     pathname in *sockaddr*
  # *   Errno::ENAMETOOLLONG - a component of a pathname exceeded NAME_MAX
  #     characters, or an entire pathname exceeded PATH_MAX characters
  # *   Errno::ENOENT - a component of the pathname does not name an existing file
  #     or the pathname is an empty string
  # *   Errno::ENOTDIR - a component of the path prefix of the pathname in
  #     *sockaddr* is not a directory
  # *   Errno::EROFS - the name would reside on a read only filesystem
  #
  # ### Windows Exceptions
  # On Windows systems the following system exceptions may be raised if the call
  # to *bind* fails:
  # *   Errno::ENETDOWN-- the network is down
  # *   Errno::EACCES - the attempt to connect the datagram socket to the
  #     broadcast address failed
  # *   Errno::EADDRINUSE - the socket's local address is already in use
  # *   Errno::EADDRNOTAVAIL - the specified address is not a valid address for
  #     this computer
  # *   Errno::EFAULT - the socket's internal address or address length parameter
  #     is too small or is not a valid part of the user space addressed
  # *   Errno::EINVAL - the `socket` is already bound to an address
  # *   Errno::ENOBUFS - no buffer space is available
  # *   Errno::ENOTSOCK - the `socket` argument does not refer to a socket
  #
  # ### See
  # *   bind manual pages on unix-based systems
  # *   bind function in Microsoft's Winsock functions reference
  #
  def bind: (String | Addrinfo local_sockaddr) -> void

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - socket.connect(remote_sockaddr) => 0
  # -->
  # Requests a connection to be made on the given `remote_sockaddr`. Returns 0 if
  # successful, otherwise an exception is raised.
  #
  # ### Parameter
  # *   `remote_sockaddr` - the `struct` sockaddr contained in a string or
  #     Addrinfo object
  #
  # ### Example:
  #     # Pull down Google's web page
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
  #     sockaddr = Socket.pack_sockaddr_in( 80, 'www.google.com' )
  #     socket.connect( sockaddr )
  #     socket.write( "GET / HTTP/1.0\r\n\r\n" )
  #     results = socket.read
  #
  # ### Unix-based Exceptions
  # On unix-based systems the following system exceptions may be raised if the
  # call to *connect* fails:
  # *   Errno::EACCES - search permission is denied for a component of the prefix
  #     path or write access to the `socket` is denied
  # *   Errno::EADDRINUSE - the *sockaddr* is already in use
  # *   Errno::EADDRNOTAVAIL - the specified *sockaddr* is not available from the
  #     local machine
  # *   Errno::EAFNOSUPPORT - the specified *sockaddr* is not a valid address for
  #     the address family of the specified `socket`
  # *   Errno::EALREADY - a connection is already in progress for the specified
  #     socket
  # *   Errno::EBADF - the `socket` is not a valid file descriptor
  # *   Errno::ECONNREFUSED - the target *sockaddr* was not listening for
  #     connections refused the connection request
  # *   Errno::ECONNRESET - the remote host reset the connection request
  # *   Errno::EFAULT - the *sockaddr* cannot be accessed
  # *   Errno::EHOSTUNREACH - the destination host cannot be reached (probably
  #     because the host is down or a remote router cannot reach it)
  # *   Errno::EINPROGRESS - the O_NONBLOCK is set for the `socket` and the
  #     connection cannot be immediately established; the connection will be
  #     established asynchronously
  # *   Errno::EINTR - the attempt to establish the connection was interrupted by
  #     delivery of a signal that was caught; the connection will be established
  #     asynchronously
  # *   Errno::EISCONN - the specified `socket` is already connected
  # *   Errno::EINVAL - the address length used for the *sockaddr* is not a valid
  #     length for the address family or there is an invalid family in *sockaddr*
  # *   Errno::ENAMETOOLONG - the pathname resolved had a length which exceeded
  #     PATH_MAX
  # *   Errno::ENETDOWN - the local interface used to reach the destination is
  #     down
  # *   Errno::ENETUNREACH - no route to the network is present
  # *   Errno::ENOBUFS - no buffer space is available
  # *   Errno::ENOSR - there were insufficient STREAMS resources available to
  #     complete the operation
  # *   Errno::ENOTSOCK - the `socket` argument does not refer to a socket
  # *   Errno::EOPNOTSUPP - the calling `socket` is listening and cannot be
  #     connected
  # *   Errno::EPROTOTYPE - the *sockaddr* has a different type than the socket
  #     bound to the specified peer address
  # *   Errno::ETIMEDOUT - the attempt to connect timed out before a connection
  #     was made.
  #
  # On unix-based systems if the address family of the calling `socket` is AF_UNIX
  # the follow exceptions may be raised if the call to *connect* fails:
  # *   Errno::EIO - an i/o error occurred while reading from or writing to the
  #     file system
  # *   Errno::ELOOP - too many symbolic links were encountered in translating the
  #     pathname in *sockaddr*
  # *   Errno::ENAMETOOLLONG - a component of a pathname exceeded NAME_MAX
  #     characters, or an entire pathname exceeded PATH_MAX characters
  # *   Errno::ENOENT - a component of the pathname does not name an existing file
  #     or the pathname is an empty string
  # *   Errno::ENOTDIR - a component of the path prefix of the pathname in
  #     *sockaddr* is not a directory
  #
  # ### Windows Exceptions
  # On Windows systems the following system exceptions may be raised if the call
  # to *connect* fails:
  # *   Errno::ENETDOWN - the network is down
  # *   Errno::EADDRINUSE - the socket's local address is already in use
  # *   Errno::EINTR - the socket was cancelled
  # *   Errno::EINPROGRESS - a blocking socket is in progress or the service
  #     provider is still processing a callback function. Or a nonblocking connect
  #     call is in progress on the `socket`.
  # *   Errno::EALREADY - see Errno::EINVAL
  # *   Errno::EADDRNOTAVAIL - the remote address is not a valid address, such as
  #     ADDR_ANY TODO check ADDRANY TO INADDR_ANY
  # *   Errno::EAFNOSUPPORT - addresses in the specified family cannot be used
  #     with with this `socket`
  # *   Errno::ECONNREFUSED - the target *sockaddr* was not listening for
  #     connections refused the connection request
  # *   Errno::EFAULT - the socket's internal address or address length parameter
  #     is too small or is not a valid part of the user space address
  # *   Errno::EINVAL - the `socket` is a listening socket
  # *   Errno::EISCONN - the `socket` is already connected
  # *   Errno::ENETUNREACH - the network cannot be reached from this host at this
  #     time
  # *   Errno::EHOSTUNREACH - no route to the network is present
  # *   Errno::ENOBUFS - no buffer space is available
  # *   Errno::ENOTSOCK - the `socket` argument does not refer to a socket
  # *   Errno::ETIMEDOUT - the attempt to connect timed out before a connection
  #     was made.
  # *   Errno::EWOULDBLOCK - the socket is marked as nonblocking and the
  #     connection cannot be completed immediately
  # *   Errno::EACCES - the attempt to connect the datagram socket to the
  #     broadcast address failed
  #
  # ### See
  # *   connect manual pages on unix-based systems
  # *   connect function in Microsoft's Winsock functions reference
  #
  def connect: (String | Addrinfo remote_sockaddr) -> Integer

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - socket.connect_nonblock(remote_sockaddr, [options]) => 0
  # -->
  # Requests a connection to be made on the given `remote_sockaddr` after
  # O_NONBLOCK is set for the underlying file descriptor. Returns 0 if successful,
  # otherwise an exception is raised.
  #
  # ### Parameter
  # *   `remote_sockaddr` - the `struct` sockaddr contained in a string or
  #     Addrinfo object
  #
  # ### Example:
  #     # Pull down Google's web page
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #     sockaddr = Socket.sockaddr_in(80, 'www.google.com')
  #     begin # emulate blocking connect
  #       socket.connect_nonblock(sockaddr)
  #     rescue IO::WaitWritable
  #       IO.select(nil, [socket]) # wait 3-way handshake completion
  #       begin
  #         socket.connect_nonblock(sockaddr) # check connection failure
  #       rescue Errno::EISCONN
  #       end
  #     end
  #     socket.write("GET / HTTP/1.0\r\n\r\n")
  #     results = socket.read
  #
  # Refer to Socket#connect for the exceptions that may be thrown if the call to
  # *connect_nonblock* fails.
  #
  # Socket#connect_nonblock may raise any error corresponding to connect(2)
  # failure, including Errno::EINPROGRESS.
  #
  # If the exception is Errno::EINPROGRESS, it is extended by IO::WaitWritable. So
  # IO::WaitWritable can be used to rescue the exceptions for retrying
  # connect_nonblock.
  #
  # By specifying a keyword argument *exception* to `false`, you can indicate that
  # connect_nonblock should not raise an IO::WaitWritable exception, but return
  # the symbol `:wait_writable` instead.
  #
  # ### See
  # *   Socket#connect
  #
  def connect_nonblock: (untyped addr, ?exception: untyped) -> (Integer | :wait_writable)

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - ipv6only!()
  # -->
  # enable the socket option IPV6_V6ONLY if IPV6_V6ONLY is available.
  #
  def ipv6only!: () -> void

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - socket.listen( int ) => 0
  # -->
  # Listens for connections, using the specified `int` as the backlog. A call to
  # *listen* only applies if the `socket` is of type SOCK_STREAM or
  # SOCK_SEQPACKET.
  #
  # ### Parameter
  # *   `backlog` - the maximum length of the queue for pending connections.
  #
  # ### Example 1
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
  #     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
  #     socket.bind( sockaddr )
  #     socket.listen( 5 )
  #
  # ### Example 2 (listening on an arbitrary port, unix-based systems only):
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
  #     socket.listen( 1 )
  #
  # ### Unix-based Exceptions
  # On unix based systems the above will work because a new `sockaddr` struct is
  # created on the address ADDR_ANY, for an arbitrary port number as handed off by
  # the kernel. It will not work on Windows, because Windows requires that the
  # `socket` is bound by calling *bind* before it can *listen*.
  #
  # If the *backlog* amount exceeds the implementation-dependent maximum queue
  # length, the implementation's maximum queue length will be used.
  #
  # On unix-based based systems the following system exceptions may be raised if
  # the call to *listen* fails:
  # *   Errno::EBADF - the *socket* argument is not a valid file descriptor
  # *   Errno::EDESTADDRREQ - the *socket* is not bound to a local address, and
  #     the protocol does not support listening on an unbound socket
  # *   Errno::EINVAL - the *socket* is already connected
  # *   Errno::ENOTSOCK - the *socket* argument does not refer to a socket
  # *   Errno::EOPNOTSUPP - the *socket* protocol does not support listen
  # *   Errno::EACCES - the calling process does not have appropriate privileges
  # *   Errno::EINVAL - the *socket* has been shut down
  # *   Errno::ENOBUFS - insufficient resources are available in the system to
  #     complete the call
  #
  # ### Windows Exceptions
  # On Windows systems the following system exceptions may be raised if the call
  # to *listen* fails:
  # *   Errno::ENETDOWN - the network is down
  # *   Errno::EADDRINUSE - the socket's local address is already in use. This
  #     usually occurs during the execution of *bind* but could be delayed if the
  #     call to *bind* was to a partially wildcard address (involving ADDR_ANY)
  #     and if a specific address needs to be committed at the time of the call to
  #     *listen*
  # *   Errno::EINPROGRESS - a Windows Sockets 1.1 call is in progress or the
  #     service provider is still processing a callback function
  # *   Errno::EINVAL - the `socket` has not been bound with a call to *bind*.
  # *   Errno::EISCONN - the `socket` is already connected
  # *   Errno::EMFILE - no more socket descriptors are available
  # *   Errno::ENOBUFS - no buffer space is available
  # *   Errno::ENOTSOC - `socket` is not a socket
  # *   Errno::EOPNOTSUPP - the referenced `socket` is not a type that supports
  #     the *listen* method
  #
  # ### See
  # *   listen manual pages on unix-based systems
  # *   listen function in Microsoft's Winsock functions reference
  #
  def listen: (Integer backlog_len) -> void

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - socket.recvfrom(maxlen) => [mesg, sender_addrinfo]
  #   - socket.recvfrom(maxlen, flags) => [mesg, sender_addrinfo]
  # -->
  # Receives up to *maxlen* bytes from `socket`. *flags* is zero or more of the
  # `MSG_` options. The first element of the results, *mesg*, is the data
  # received. The second element, *sender_addrinfo*, contains protocol-specific
  # address information of the sender.
  #
  # ### Parameters
  # *   `maxlen` - the maximum number of bytes to receive from the socket
  # *   `flags` - zero or more of the `MSG_` options
  #
  # ### Example
  #     # In one file, start this first
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
  #     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
  #     socket.bind( sockaddr )
  #     socket.listen( 5 )
  #     client, client_addrinfo = socket.accept
  #     data = client.recvfrom( 20 )[0].chomp
  #     puts "I only received 20 bytes '#{data}'"
  #     sleep 1
  #     socket.close
  #
  #     # In another file, start this second
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
  #     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
  #     socket.connect( sockaddr )
  #     socket.puts "Watch this get cut short!"
  #     socket.close
  #
  # ### Unix-based Exceptions
  # On unix-based based systems the following system exceptions may be raised if
  # the call to *recvfrom* fails:
  # *   Errno::EAGAIN - the `socket` file descriptor is marked as O_NONBLOCK and
  #     no data is waiting to be received; or MSG_OOB is set and no out-of-band
  #     data is available and either the `socket` file descriptor is marked as
  #     O_NONBLOCK or the `socket` does not support blocking to wait for
  #     out-of-band-data
  # *   Errno::EWOULDBLOCK - see Errno::EAGAIN
  # *   Errno::EBADF - the `socket` is not a valid file descriptor
  # *   Errno::ECONNRESET - a connection was forcibly closed by a peer
  # *   Errno::EFAULT - the socket's internal buffer, address or address length
  #     cannot be accessed or written
  # *   Errno::EINTR - a signal interrupted *recvfrom* before any data was
  #     available
  # *   Errno::EINVAL - the MSG_OOB flag is set and no out-of-band data is
  #     available
  # *   Errno::EIO - an i/o error occurred while reading from or writing to the
  #     filesystem
  # *   Errno::ENOBUFS - insufficient resources were available in the system to
  #     perform the operation
  # *   Errno::ENOMEM - insufficient memory was available to fulfill the request
  # *   Errno::ENOSR - there were insufficient STREAMS resources available to
  #     complete the operation
  # *   Errno::ENOTCONN - a receive is attempted on a connection-mode socket that
  #     is not connected
  # *   Errno::ENOTSOCK - the `socket` does not refer to a socket
  # *   Errno::EOPNOTSUPP - the specified flags are not supported for this socket
  #     type
  # *   Errno::ETIMEDOUT - the connection timed out during connection
  #     establishment or due to a transmission timeout on an active connection
  #
  # ### Windows Exceptions
  # On Windows systems the following system exceptions may be raised if the call
  # to *recvfrom* fails:
  # *   Errno::ENETDOWN - the network is down
  # *   Errno::EFAULT - the internal buffer and from parameters on `socket` are
  #     not part of the user address space, or the internal fromlen parameter is
  #     too small to accommodate the peer address
  # *   Errno::EINTR - the (blocking) call was cancelled by an internal call to
  #     the WinSock function WSACancelBlockingCall
  # *   Errno::EINPROGRESS - a blocking Windows Sockets 1.1 call is in progress or
  #     the service provider is still processing a callback function
  # *   Errno::EINVAL - `socket` has not been bound with a call to *bind*, or an
  #     unknown flag was specified, or MSG_OOB was specified for a socket with
  #     SO_OOBINLINE enabled, or (for byte stream-style sockets only) the internal
  #     len parameter on `socket` was zero or negative
  # *   Errno::EISCONN - `socket` is already connected. The call to *recvfrom* is
  #     not permitted with a connected socket on a socket that is connection
  #     oriented or connectionless.
  # *   Errno::ENETRESET - the connection has been broken due to the keep-alive
  #     activity detecting a failure while the operation was in progress.
  # *   Errno::EOPNOTSUPP - MSG_OOB was specified, but `socket` is not
  #     stream-style such as type SOCK_STREAM. OOB data is not supported in the
  #     communication domain associated with `socket`, or `socket` is
  #     unidirectional and supports only send operations
  # *   Errno::ESHUTDOWN - `socket` has been shutdown. It is not possible to call
  #     *recvfrom* on a socket after *shutdown* has been invoked.
  # *   Errno::EWOULDBLOCK - `socket` is marked as nonblocking and a  call to
  #     *recvfrom* would block.
  # *   Errno::EMSGSIZE - the message was too large to fit into the specified
  #     buffer and was truncated.
  # *   Errno::ETIMEDOUT - the connection has been dropped, because of a network
  #     failure or because the system on the other end went down without notice
  # *   Errno::ECONNRESET - the virtual circuit was reset by the remote side
  #     executing a hard or abortive close. The application should close the
  #     socket; it is no longer usable. On a UDP-datagram socket this error
  #     indicates a previous send operation resulted in an ICMP Port Unreachable
  #     message.
  #
  def recvfrom: (Integer maxlen, ?Integer flags) -> [ String, Addrinfo ]

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - socket.recvfrom_nonblock(maxlen[, flags[, outbuf[, opts]]]) => [mesg, sender_addrinfo]
  # -->
  # Receives up to *maxlen* bytes from `socket` using recvfrom(2) after O_NONBLOCK
  # is set for the underlying file descriptor. *flags* is zero or more of the
  # `MSG_` options. The first element of the results, *mesg*, is the data
  # received. The second element, *sender_addrinfo*, contains protocol-specific
  # address information of the sender.
  #
  # When recvfrom(2) returns 0, Socket#recv_nonblock returns nil. In most cases it
  # means the connection was closed, but for UDP connections it may mean an empty
  # packet was received, as the underlying API makes it impossible to distinguish
  # these two cases.
  #
  # ### Parameters
  # *   `maxlen` - the maximum number of bytes to receive from the socket
  # *   `flags` - zero or more of the `MSG_` options
  # *   `outbuf` - destination String buffer
  # *   `opts` - keyword hash, supporting `exception: false`
  #
  # ### Example
  #     # In one file, start this first
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #     sockaddr = Socket.sockaddr_in(2200, 'localhost')
  #     socket.bind(sockaddr)
  #     socket.listen(5)
  #     client, client_addrinfo = socket.accept
  #     begin # emulate blocking recvfrom
  #       pair = client.recvfrom_nonblock(20)
  #     rescue IO::WaitReadable
  #       IO.select([client])
  #       retry
  #     end
  #     data = pair[0].chomp
  #     puts "I only received 20 bytes '#{data}'"
  #     sleep 1
  #     socket.close
  #
  #     # In another file, start this second
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new(AF_INET, SOCK_STREAM, 0)
  #     sockaddr = Socket.sockaddr_in(2200, 'localhost')
  #     socket.connect(sockaddr)
  #     socket.puts "Watch this get cut short!"
  #     socket.close
  #
  # Refer to Socket#recvfrom for the exceptions that may be thrown if the call to
  # *recvfrom_nonblock* fails.
  #
  # Socket#recvfrom_nonblock may raise any error corresponding to recvfrom(2)
  # failure, including Errno::EWOULDBLOCK.
  #
  # If the exception is Errno::EWOULDBLOCK or Errno::EAGAIN, it is extended by
  # IO::WaitReadable. So IO::WaitReadable can be used to rescue the exceptions for
  # retrying recvfrom_nonblock.
  #
  # By specifying a keyword argument *exception* to `false`, you can indicate that
  # recvfrom_nonblock should not raise an IO::WaitReadable exception, but return
  # the symbol `:wait_readable` instead.
  #
  # ### See
  # *   Socket#recvfrom
  #
  def recvfrom_nonblock: (Integer maxlen, ?Integer flags, ?untyped outbuf, ?exception: boolish) -> ([ String, Addrinfo ] | :wait_readable)

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - socket.sysaccept => [client_socket_fd, client_addrinfo]
  # -->
  # Accepts an incoming connection returning an array containing the (integer)
  # file descriptor for the incoming connection, *client_socket_fd*, and an
  # Addrinfo, *client_addrinfo*.
  #
  # ### Example
  #     # In one script, start this first
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
  #     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
  #     socket.bind( sockaddr )
  #     socket.listen( 5 )
  #     client_fd, client_addrinfo = socket.sysaccept
  #     client_socket = Socket.for_fd( client_fd )
  #     puts "The client said, '#{client_socket.readline.chomp}'"
  #     client_socket.puts "Hello from script one!"
  #     socket.close
  #
  #     # In another script, start this second
  #     require 'socket'
  #     include Socket::Constants
  #     socket = Socket.new( AF_INET, SOCK_STREAM, 0 )
  #     sockaddr = Socket.pack_sockaddr_in( 2200, 'localhost' )
  #     socket.connect( sockaddr )
  #     socket.puts "Hello from script 2."
  #     puts "The server said, '#{socket.readline.chomp}'"
  #     socket.close
  #
  # Refer to Socket#accept for the exceptions that may be thrown if the call to
  # *sysaccept* fails.
  #
  # ### See
  # *   Socket#accept
  #
  def sysaccept: () -> [ Integer, Addrinfo ]

  private

  def __accept_nonblock: (untyped) -> untyped

  def __connect_nonblock: (untyped, untyped) -> untyped

  def __recvfrom_nonblock: (untyped, untyped, untyped, untyped) -> untyped

  # <!--
  #   rdoc-file=ext/socket/socket.c
  #   - Socket.new(domain, socktype [, protocol]) => socket
  # -->
  # Creates a new socket object.
  #
  # *domain* should be a communications domain such as: :INET, :INET6, :UNIX, etc.
  #
  # *socktype* should be a socket type such as: :STREAM, :DGRAM, :RAW, etc.
  #
  # *protocol* is optional and should be a protocol defined in the domain. If
  # protocol is not given, 0 is used internally.
  #
  #     Socket.new(:INET, :STREAM) # TCP socket
  #     Socket.new(:INET, :DGRAM)  # UDP socket
  #     Socket.new(:UNIX, :STREAM) # UNIX stream socket
  #     Socket.new(:UNIX, :DGRAM)  # UNIX datagram socket
  #
  def initialize: (Symbol | Integer domain, Symbol | Integer socktype, ?Integer protocol) -> untyped
end

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Interface to kernel crypto API
#
Socket::AF_ALG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# AppleTalk protocol
#
Socket::AF_APPLETALK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Asynchronous Transfer Mode
#
Socket::AF_ATM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# AX.25 protocol
#
Socket::AF_AX25: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Bluetooth low-level socket protocol
#
Socket::AF_BLUETOOTH: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Controller Area Network automotive bus protocol
#
Socket::AF_CAN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# CCITT (now ITU-T) protocols
#
Socket::AF_CCITT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# MIT CHAOS protocols
#
Socket::AF_CHAOS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Computer Network Technology
#
Socket::AF_CNT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Connection-oriented IP
#
Socket::AF_COIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Datakit protocol
#
Socket::AF_DATAKIT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# DECnet protocol
#
Socket::AF_DEC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# DECnet protocol
#
Socket::AF_DECnet: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# DEC Direct Data Link Interface protocol
#
Socket::AF_DLI: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# CCITT (ITU-T) E.164 recommendation
#
Socket::AF_E164: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# European Computer Manufacturers protocols
#
Socket::AF_ECMA: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# NSC Hyperchannel protocol
#
Socket::AF_HYLINK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# InfiniBand native addressing
#
Socket::AF_IB: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ARPANET IMP protocol
#
Socket::AF_IMPLINK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IPv4 protocol
#
Socket::AF_INET: Integer

# <!-- rdoc-file=lib/ipaddr.rb -->
# IPv6 protocol family
#
Socket::AF_INET6: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IPX protocol
#
Socket::AF_IPX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Integrated Services Digital Network
#
Socket::AF_ISDN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ISO Open Systems Interconnection protocols
#
Socket::AF_ISO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# KCM (kernel connection multiplexor) interface
#
Socket::AF_KCM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Key management protocol, originally developed for usage with IPsec
#
Socket::AF_KEY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Local Area Transport protocol
#
Socket::AF_LAT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Link layer interface
#
Socket::AF_LINK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Logical  link control (IEEE 802.2 LLC) protocol
#
Socket::AF_LLC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Host-internal protocols
#
Socket::AF_LOCAL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum address family for this platform
#
Socket::AF_MAX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Multiprotocol Label Switching
#
Socket::AF_MPLS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Native ATM access
#
Socket::AF_NATM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Network driver raw access
#
Socket::AF_NDRV: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# NetBIOS
#
Socket::AF_NETBIOS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Netgraph sockets
#
Socket::AF_NETGRAPH: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Kernel user interface device
#
Socket::AF_NETLINK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# XEROX NS protocols
#
Socket::AF_NS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ISO Open Systems Interconnection protocols
#
Socket::AF_OSI: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Direct link-layer access
#
Socket::AF_PACKET: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Point-to-Point Protocol
#
Socket::AF_PPP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Generic PPP transport layer, for setting up L2 tunnels (L2TP and PPPoE)
#
Socket::AF_PPPOX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# PARC Universal Packet protocol
#
Socket::AF_PUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Reliable Datagram Sockets (RDS) protocol
#
Socket::AF_RDS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Internal routing protocol
#
Socket::AF_ROUTE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Simple Internet Protocol
#
Socket::AF_SIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IBM SNA protocol
#
Socket::AF_SNA: Integer
Socket::AF_SYSTEM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# TIPC, "cluster domain sockets" protocol
#
Socket::AF_TIPC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# UNIX sockets
#
Socket::AF_UNIX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Unspecified protocol, any supported address family
#
Socket::AF_UNSPEC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# VSOCK (originally "VMWare VSockets") protocol for hypervisor-guest
# communication
#
Socket::AF_VSOCK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# XDP (express data path) interface
#
Socket::AF_XDP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Accept only if any address is assigned
#
Socket::AI_ADDRCONFIG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Allow all addresses
#
Socket::AI_ALL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Fill in the canonical name
#
Socket::AI_CANONNAME: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Default flags for getaddrinfo
#
Socket::AI_DEFAULT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Valid flag mask for getaddrinfo (not for application use)
#
Socket::AI_MASK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Prevent host name resolution
#
Socket::AI_NUMERICHOST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Prevent service name resolution
#
Socket::AI_NUMERICSERV: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Get address to use with bind()
#
Socket::AI_PASSIVE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Accept IPv4-mapped IPv6 addresses
#
Socket::AI_V4MAPPED: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Accept IPv4 mapped addresses if the kernel supports it
#
Socket::AI_V4MAPPED_CFG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Address family for hostname not supported
#
Socket::EAI_ADDRFAMILY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Temporary failure in name resolution
#
Socket::EAI_AGAIN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Invalid flags
#
Socket::EAI_BADFLAGS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Invalid value for hints
#
Socket::EAI_BADHINTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Non-recoverable failure in name resolution
#
Socket::EAI_FAIL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Address family not supported
#
Socket::EAI_FAMILY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum error code from getaddrinfo
#
Socket::EAI_MAX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Memory allocation failure
#
Socket::EAI_MEMORY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# No address associated with hostname
#
Socket::EAI_NODATA: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Hostname nor servname, or not known
#
Socket::EAI_NONAME: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Argument buffer overflow
#
Socket::EAI_OVERFLOW: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Resolved protocol is unknown
#
Socket::EAI_PROTOCOL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Servname not supported for socket type
#
Socket::EAI_SERVICE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Socket type not supported
#
Socket::EAI_SOCKTYPE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# System error returned in errno
#
Socket::EAI_SYSTEM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# 802.1Q VLAN device
#
Socket::IFF_802_1Q_VLAN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# receive all multicast packets
#
Socket::IFF_ALLMULTI: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# use alternate physical connection
#
Socket::IFF_ALTPHYS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# auto media select active
#
Socket::IFF_AUTOMEDIA: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# bonding master or slave
#
Socket::IFF_BONDING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# device used as bridge port
#
Socket::IFF_BRIDGE_PORT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# broadcast address valid
#
Socket::IFF_BROADCAST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# flags not changeable
#
Socket::IFF_CANTCHANGE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# unconfigurable using ioctl(2)
#
Socket::IFF_CANTCONFIG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# turn on debugging
#
Socket::IFF_DEBUG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# disable netpoll at run-time
#
Socket::IFF_DISABLE_NETPOLL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# disallow bridging this ether dev
#
Socket::IFF_DONT_BRIDGE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# driver signals dormant
#
Socket::IFF_DORMANT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# tx hardware queue is full
#
Socket::IFF_DRV_OACTIVE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# resources allocated
#
Socket::IFF_DRV_RUNNING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# interface is winding down
#
Socket::IFF_DYING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# dialup device with changing addresses
#
Socket::IFF_DYNAMIC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ethernet bridging device
#
Socket::IFF_EBRIDGE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# echo sent packets
#
Socket::IFF_ECHO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ISATAP interface (RFC4214)
#
Socket::IFF_ISATAP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# per link layer defined bit 0
#
Socket::IFF_LINK0: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# per link layer defined bit 1
#
Socket::IFF_LINK1: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# per link layer defined bit 2
#
Socket::IFF_LINK2: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# hardware address change when it's running
#
Socket::IFF_LIVE_ADDR_CHANGE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# loopback net
#
Socket::IFF_LOOPBACK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# driver signals L1 up
#
Socket::IFF_LOWER_UP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# device used as macvlan port
#
Socket::IFF_MACVLAN_PORT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# master of a load balancer
#
Socket::IFF_MASTER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# bonding master, 802.3ad.
#
Socket::IFF_MASTER_8023AD: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# bonding master, balance-alb.
#
Socket::IFF_MASTER_ALB: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# bonding master, ARP mon in use
#
Socket::IFF_MASTER_ARPMON: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# user-requested monitor mode
#
Socket::IFF_MONITOR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# supports multicast
#
Socket::IFF_MULTICAST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# no address resolution protocol
#
Socket::IFF_NOARP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# avoid use of trailers
#
Socket::IFF_NOTRAILERS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# transmission in progress
#
Socket::IFF_OACTIVE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# device used as Open vSwitch datapath port
#
Socket::IFF_OVS_DATAPATH: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# point-to-point link
#
Socket::IFF_POINTOPOINT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# can set media type
#
Socket::IFF_PORTSEL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# user-requested promisc mode
#
Socket::IFF_PPROMISC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# receive all packets
#
Socket::IFF_PROMISC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# interface is being renamed
#
Socket::IFF_RENAMING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# routing entry installed
#
Socket::IFF_ROUTE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# resources allocated
#
Socket::IFF_RUNNING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# can't hear own transmissions
#
Socket::IFF_SIMPLEX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# slave of a load balancer
#
Socket::IFF_SLAVE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# bonding slave not the curr. active
#
Socket::IFF_SLAVE_INACTIVE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# need ARPs for validation
#
Socket::IFF_SLAVE_NEEDARP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# interface manages own routes
#
Socket::IFF_SMART: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# static ARP
#
Socket::IFF_STATICARP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# sending custom FCS
#
Socket::IFF_SUPP_NOFCS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# used as team port
#
Socket::IFF_TEAM_PORT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# sharing skbs on transmit
#
Socket::IFF_TX_SKB_SHARING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# unicast filtering
#
Socket::IFF_UNICAST_FLT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# interface is up
#
Socket::IFF_UP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# volatile flags
#
Socket::IFF_VOLATILE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# WAN HDLC device
#
Socket::IFF_WAN_HDLC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# dev_hard_start_xmit() is allowed to release skb->dst
#
Socket::IFF_XMIT_DST_RELEASE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum interface name size
#
Socket::IFNAMSIZ: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum interface name size
#
Socket::IF_NAMESIZE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Multicast group for all systems on this subset
#
Socket::INADDR_ALLHOSTS_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# A socket bound to INADDR_ANY receives packets from all interfaces and sends
# from the default IP address
#
Socket::INADDR_ANY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The network broadcast address
#
Socket::INADDR_BROADCAST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The loopback address
#
Socket::INADDR_LOOPBACK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The last local network multicast group
#
Socket::INADDR_MAX_LOCAL_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# A bitmask for matching no valid IP address
#
Socket::INADDR_NONE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The reserved multicast group
#
Socket::INADDR_UNSPEC_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum length of an IPv6 address string
#
Socket::INET6_ADDRSTRLEN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum length of an IPv4 address string
#
Socket::INET_ADDRSTRLEN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Default minimum address for bind or connect
#
Socket::IPPORT_RESERVED: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Default maximum address for bind or connect
#
Socket::IPPORT_USERRESERVED: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 auth header
#
Socket::IPPROTO_AH: Integer
Socket::IPPROTO_BIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 destination option
#
Socket::IPPROTO_DSTOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Exterior Gateway Protocol
#
Socket::IPPROTO_EGP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ISO cnlp
#
Socket::IPPROTO_EON: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 Encapsulated Security Payload
#
Socket::IPPROTO_ESP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 fragmentation header
#
Socket::IPPROTO_FRAGMENT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Gateway to Gateway Protocol
#
Socket::IPPROTO_GGP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# "hello" routing protocol
#
Socket::IPPROTO_HELLO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 hop-by-hop options
#
Socket::IPPROTO_HOPOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Control message protocol
#
Socket::IPPROTO_ICMP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ICMP6
#
Socket::IPPROTO_ICMPV6: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# XNS IDP
#
Socket::IPPROTO_IDP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Group Management Protocol
#
Socket::IPPROTO_IGMP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Dummy protocol for IP
#
Socket::IPPROTO_IP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 header
#
Socket::IPPROTO_IPV6: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum IPPROTO constant
#
Socket::IPPROTO_MAX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Sun net disk protocol
#
Socket::IPPROTO_ND: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 no next header
#
Socket::IPPROTO_NONE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# PARC Universal Packet protocol
#
Socket::IPPROTO_PUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Raw IP packet
#
Socket::IPPROTO_RAW: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 routing header
#
Socket::IPPROTO_ROUTING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# TCP
#
Socket::IPPROTO_TCP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ISO transport protocol class 4
#
Socket::IPPROTO_TP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# UDP
#
Socket::IPPROTO_UDP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Xpress Transport Protocol
#
Socket::IPPROTO_XTP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Checksum offset for raw sockets
#
Socket::IPV6_CHECKSUM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't fragment packets
#
Socket::IPV6_DONTFRAG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Destination option
#
Socket::IPV6_DSTOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Hop limit
#
Socket::IPV6_HOPLIMIT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Hop-by-hop option
#
Socket::IPV6_HOPOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Join a group membership
#
Socket::IPV6_JOIN_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Leave a group membership
#
Socket::IPV6_LEAVE_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 multicast hops
#
Socket::IPV6_MULTICAST_HOPS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 multicast interface
#
Socket::IPV6_MULTICAST_IF: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 multicast loopback
#
Socket::IPV6_MULTICAST_LOOP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Next hop address
#
Socket::IPV6_NEXTHOP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Retrieve current path MTU
#
Socket::IPV6_PATHMTU: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive packet information with datagram
#
Socket::IPV6_PKTINFO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive all IP6 options for response
#
Socket::IPV6_RECVDSTOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive hop limit with datagram
#
Socket::IPV6_RECVHOPLIMIT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive hop-by-hop options
#
Socket::IPV6_RECVHOPOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive current path MTU with datagram
#
Socket::IPV6_RECVPATHMTU: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive destination IP address and incoming interface
#
Socket::IPV6_RECVPKTINFO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive routing header
#
Socket::IPV6_RECVRTHDR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive traffic class
#
Socket::IPV6_RECVTCLASS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Allows removal of sticky routing headers
#
Socket::IPV6_RTHDR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Allows removal of sticky destination options header
#
Socket::IPV6_RTHDRDSTOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Routing header type 0
#
Socket::IPV6_RTHDR_TYPE_0: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Specify the traffic class
#
Socket::IPV6_TCLASS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP6 unicast hops
#
Socket::IPV6_UNICAST_HOPS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Use the minimum MTU size
#
Socket::IPV6_USE_MIN_MTU: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Only bind IPv6 with a wildcard bind
#
Socket::IPV6_V6ONLY: Integer
Socket::IPX_TYPE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Add a multicast group membership
#
Socket::IP_ADD_MEMBERSHIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Add a multicast group membership
#
Socket::IP_ADD_SOURCE_MEMBERSHIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Block IPv4 multicast packets with a give source address
#
Socket::IP_BLOCK_SOURCE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Default multicast loopback
#
Socket::IP_DEFAULT_MULTICAST_LOOP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Default multicast TTL
#
Socket::IP_DEFAULT_MULTICAST_TTL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't fragment packets
#
Socket::IP_DONTFRAG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Drop a multicast group membership
#
Socket::IP_DROP_MEMBERSHIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Drop a multicast group membership
#
Socket::IP_DROP_SOURCE_MEMBERSHIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Allow binding to nonexistent IP addresses
#
Socket::IP_FREEBIND: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Header is included with data
#
Socket::IP_HDRINCL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IPsec security policy
#
Socket::IP_IPSEC_POLICY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum number multicast groups a socket can join
#
Socket::IP_MAX_MEMBERSHIPS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Minimum TTL allowed for received packets
#
Socket::IP_MINTTL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Multicast source filtering
#
Socket::IP_MSFILTER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The Maximum Transmission Unit of the socket
#
Socket::IP_MTU: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Path MTU discovery
#
Socket::IP_MTU_DISCOVER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP multicast interface
#
Socket::IP_MULTICAST_IF: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP multicast loopback
#
Socket::IP_MULTICAST_LOOP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP multicast TTL
#
Socket::IP_MULTICAST_TTL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Force outgoing broadcast datagrams to have the undirected broadcast address
#
Socket::IP_ONESBCAST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP options to be included in packets
#
Socket::IP_OPTIONS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Retrieve security context with datagram
#
Socket::IP_PASSSEC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive packet information with datagrams
#
Socket::IP_PKTINFO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive packet options with datagrams
#
Socket::IP_PKTOPTIONS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Always send DF frames
#
Socket::IP_PMTUDISC_DO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Never send DF frames
#
Socket::IP_PMTUDISC_DONT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Use per-route hints
#
Socket::IP_PMTUDISC_WANT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set the port range for sockets with unspecified port numbers
#
Socket::IP_PORTRANGE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive IP destination address with datagram
#
Socket::IP_RECVDSTADDR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Enable extended reliable error message passing
#
Socket::IP_RECVERR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive interface information with datagrams
#
Socket::IP_RECVIF: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive all IP options with datagram
#
Socket::IP_RECVOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive all IP options for response
#
Socket::IP_RECVRETOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive link-layer address with datagrams
#
Socket::IP_RECVSLLA: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive TOS with incoming packets
#
Socket::IP_RECVTOS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive IP TTL with datagrams
#
Socket::IP_RECVTTL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP options to be included in datagrams
#
Socket::IP_RETOPTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Notify transit routers to more closely examine the contents of an IP packet
#
Socket::IP_ROUTER_ALERT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Source address for outgoing UDP datagrams
#
Socket::IP_SENDSRCADDR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP type-of-service
#
Socket::IP_TOS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Transparent proxy
#
Socket::IP_TRANSPARENT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP time-to-live
#
Socket::IP_TTL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Unblock IPv4 multicast packets with a give source address
#
Socket::IP_UNBLOCK_SOURCE: Integer
Socket::IP_XFRM_POLICY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Connect blocks until accepted
#
Socket::LOCAL_CONNWAIT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Pass credentials to receiver
#
Socket::LOCAL_CREDS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Retrieve peer credentials
#
Socket::LOCAL_PEERCRED: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Block multicast packets from this source
#
Socket::MCAST_BLOCK_SOURCE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Exclusive multicast source filter
#
Socket::MCAST_EXCLUDE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Inclusive multicast source filter
#
Socket::MCAST_INCLUDE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Join a multicast group
#
Socket::MCAST_JOIN_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Join a multicast source group
#
Socket::MCAST_JOIN_SOURCE_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Leave a multicast group
#
Socket::MCAST_LEAVE_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Leave a multicast source group
#
Socket::MCAST_LEAVE_SOURCE_GROUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Multicast source filtering
#
Socket::MCAST_MSFILTER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Unblock multicast packets from this source
#
Socket::MCAST_UNBLOCK_SOURCE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# End of record
#
Socket::MSG_COMPAT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Confirm path validity
#
Socket::MSG_CONFIRM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Control data lost before delivery
#
Socket::MSG_CTRUNC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Send without using the routing tables
#
Socket::MSG_DONTROUTE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# This message should be non-blocking
#
Socket::MSG_DONTWAIT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Data completes connection
#
Socket::MSG_EOF: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Data completes record
#
Socket::MSG_EOR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Fetch message from error queue
#
Socket::MSG_ERRQUEUE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Reduce step of the handshake process
#
Socket::MSG_FASTOPEN: Integer
Socket::MSG_FIN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Start of a hold sequence.  Dumps to so_temp
#
Socket::MSG_FLUSH: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Data ready to be read
#
Socket::MSG_HAVEMORE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Hold fragment in so_temp
#
Socket::MSG_HOLD: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Sender will send more
#
Socket::MSG_MORE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Do not generate SIGPIPE
#
Socket::MSG_NOSIGNAL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Process out-of-band data
#
Socket::MSG_OOB: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Peek at incoming message
#
Socket::MSG_PEEK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Wait for full request
#
Socket::MSG_PROXY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Data remains in the current packet
#
Socket::MSG_RCVMORE: Integer
Socket::MSG_RST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Send the packet in so_temp
#
Socket::MSG_SEND: Integer
Socket::MSG_SYN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Data discarded before delivery
#
Socket::MSG_TRUNC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Wait for full request or error
#
Socket::MSG_WAITALL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The service specified is a datagram service (looks up UDP ports)
#
Socket::NI_DGRAM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum length of a hostname
#
Socket::NI_MAXHOST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum length of a service name
#
Socket::NI_MAXSERV: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# A name is required
#
Socket::NI_NAMEREQD: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# An FQDN is not required for local hosts, return only the local part
#
Socket::NI_NOFQDN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Return a numeric address
#
Socket::NI_NUMERICHOST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Return the service name as a digit string
#
Socket::NI_NUMERICSERV: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Interface to kernel crypto API
#
Socket::PF_ALG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# AppleTalk protocol
#
Socket::PF_APPLETALK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Asynchronous Transfer Mode
#
Socket::PF_ATM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# AX.25 protocol
#
Socket::PF_AX25: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Bluetooth low-level socket protocol
#
Socket::PF_BLUETOOTH: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Controller Area Network automotive bus protocol
#
Socket::PF_CAN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# CCITT (now ITU-T) protocols
#
Socket::PF_CCITT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# MIT CHAOS protocols
#
Socket::PF_CHAOS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Computer Network Technology
#
Socket::PF_CNT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Connection-oriented IP
#
Socket::PF_COIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Datakit protocol
#
Socket::PF_DATAKIT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# DECnet protocol
#
Socket::PF_DEC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# DECnet protocol
#
Socket::PF_DECnet: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# DEC Direct Data Link Interface protocol
#
Socket::PF_DLI: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# European Computer Manufacturers protocols
#
Socket::PF_ECMA: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# NSC Hyperchannel protocol
#
Socket::PF_HYLINK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# InfiniBand native addressing
#
Socket::PF_IB: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ARPANET IMP protocol
#
Socket::PF_IMPLINK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IPv4 protocol
#
Socket::PF_INET: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IPv6 protocol
#
Socket::PF_INET6: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IPX protocol
#
Socket::PF_IPX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Integrated Services Digital Network
#
Socket::PF_ISDN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ISO Open Systems Interconnection protocols
#
Socket::PF_ISO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# KCM (kernel connection multiplexor) interface
#
Socket::PF_KCM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Key management protocol, originally developed for usage with IPsec
#
Socket::PF_KEY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Local Area Transport protocol
#
Socket::PF_LAT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Link layer interface
#
Socket::PF_LINK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Logical  link control (IEEE 802.2 LLC) protocol
#
Socket::PF_LLC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Host-internal protocols
#
Socket::PF_LOCAL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum address family for this platform
#
Socket::PF_MAX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Multiprotocol Label Switching
#
Socket::PF_MPLS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Native ATM access
#
Socket::PF_NATM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Network driver raw access
#
Socket::PF_NDRV: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# NetBIOS
#
Socket::PF_NETBIOS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Netgraph sockets
#
Socket::PF_NETGRAPH: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Kernel user interface device
#
Socket::PF_NETLINK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# XEROX NS protocols
#
Socket::PF_NS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# ISO Open Systems Interconnection protocols
#
Socket::PF_OSI: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Direct link-layer access
#
Socket::PF_PACKET: Integer
Socket::PF_PIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Point-to-Point Protocol
#
Socket::PF_PPP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Generic PPP transport layer, for setting up L2 tunnels (L2TP and PPPoE)
#
Socket::PF_PPPOX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# PARC Universal Packet protocol
#
Socket::PF_PUP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Reliable Datagram Sockets (RDS) protocol
#
Socket::PF_RDS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Internal routing protocol
#
Socket::PF_ROUTE: Integer
Socket::PF_RTIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Simple Internet Protocol
#
Socket::PF_SIP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IBM SNA protocol
#
Socket::PF_SNA: Integer
Socket::PF_SYSTEM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# TIPC, "cluster domain sockets" protocol
#
Socket::PF_TIPC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# UNIX sockets
#
Socket::PF_UNIX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Unspecified protocol, any supported address family
#
Socket::PF_UNSPEC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# VSOCK (originally "VMWare VSockets") protocol for hypervisor-guest
# communication
#
Socket::PF_VSOCK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# XDP (express data path) interface
#
Socket::PF_XDP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# eXpress Transfer Protocol
#
Socket::PF_XTP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Timestamp (bintime)
#
Socket::SCM_BINTIME: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The sender's credentials
#
Socket::SCM_CREDENTIALS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Process credentials
#
Socket::SCM_CREDS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Access rights
#
Socket::SCM_RIGHTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Timestamp (timeval)
#
Socket::SCM_TIMESTAMP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Timestamp (timespec list) (Linux 2.6.30)
#
Socket::SCM_TIMESTAMPING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Timespec (timespec)
#
Socket::SCM_TIMESTAMPNS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# User credentials
#
Socket::SCM_UCRED: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Wifi status (Linux 3.3)
#
Socket::SCM_WIFI_STATUS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Shut down the reading side of the socket
#
Socket::SHUT_RD: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Shut down the both sides of the socket
#
Socket::SHUT_RDWR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Shut down the writing side of the socket
#
Socket::SHUT_WR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set the close-on-exec (FD_CLOEXEC) flag on the new file  descriptor.
#
Socket::SOCK_CLOEXEC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# A datagram socket provides connectionless, unreliable messaging
#
Socket::SOCK_DGRAM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set the O_NONBLOCK file status flag on the open file description (see open(2))
# referred to by the new file descriptor.
#
Socket::SOCK_NONBLOCK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Device-level packet access
#
Socket::SOCK_PACKET: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# A raw socket provides low-level access for direct access or implementing
# network protocols
#
Socket::SOCK_RAW: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# A reliable datagram socket provides reliable delivery of messages
#
Socket::SOCK_RDM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# A sequential packet socket provides sequenced, reliable two-way connection for
# datagrams
#
Socket::SOCK_SEQPACKET: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# A stream socket provides a sequenced, reliable two-way connection for a byte
# stream
#
Socket::SOCK_STREAM: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# AppleTalk socket options
#
Socket::SOL_ATALK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# AX.25 socket options
#
Socket::SOL_AX25: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IP socket options
#
Socket::SOL_IP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# IPX socket options
#
Socket::SOL_IPX: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Socket-level options
#
Socket::SOL_SOCKET: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# TCP socket options
#
Socket::SOL_TCP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# UDP socket options
#
Socket::SOL_UDP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum connection requests that may be queued for a socket
#
Socket::SOMAXCONN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Background socket priority
#
Socket::SOPRI_BACKGROUND: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Interactive socket priority
#
Socket::SOPRI_INTERACTIVE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Normal socket priority
#
Socket::SOPRI_NORMAL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Socket has had listen() called on it
#
Socket::SO_ACCEPTCONN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# There is an accept filter
#
Socket::SO_ACCEPTFILTER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Bypass zone boundaries
#
Socket::SO_ALLZONES: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Attach an accept filter
#
Socket::SO_ATTACH_FILTER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Only send packets from the given interface
#
Socket::SO_BINDTODEVICE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive timestamp with datagrams (bintime)
#
Socket::SO_BINTIME: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Query supported BPF extensions (Linux 3.14)
#
Socket::SO_BPF_EXTENSIONS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Permit sending of broadcast messages
#
Socket::SO_BROADCAST: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set the threshold in microseconds for low latency polling (Linux 3.11)
#
Socket::SO_BUSY_POLL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Debug info recording
#
Socket::SO_DEBUG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Detach an accept filter
#
Socket::SO_DETACH_FILTER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Domain given for socket() (Linux 2.6.32)
#
Socket::SO_DOMAIN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Use interface addresses
#
Socket::SO_DONTROUTE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Retain unread data
#
Socket::SO_DONTTRUNC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Get and clear the error status
#
Socket::SO_ERROR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Obtain filter set by SO_ATTACH_FILTER (Linux 3.8)
#
Socket::SO_GET_FILTER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive the cpu attached to the socket (Linux 3.19)
#
Socket::SO_INCOMING_CPU: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive the napi ID attached to a RX queue (Linux 4.12)
#
Socket::SO_INCOMING_NAPI_ID: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Keep connections alive
#
Socket::SO_KEEPALIVE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Linger on close if data is present
#
Socket::SO_LINGER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Lock the filter attached to a socket (Linux 3.9)
#
Socket::SO_LOCK_FILTER: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Mandatory Access Control exemption for unlabeled peers
#
Socket::SO_MAC_EXEMPT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set the mark for mark-based routing (Linux 2.6.25)
#
Socket::SO_MARK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Cap the rate computed by transport layer. [bytes per second] (Linux 3.13)
#
Socket::SO_MAX_PACING_RATE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Install socket-level Network Kernel Extension
#
Socket::SO_NKE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set netns of a socket (Linux 3.4)
#
Socket::SO_NOFCS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't SIGPIPE on EPIPE
#
Socket::SO_NOSIGPIPE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Disable checksums
#
Socket::SO_NO_CHECK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Get first packet byte count
#
Socket::SO_NREAD: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Leave received out-of-band data in-line
#
Socket::SO_OOBINLINE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive SCM_CREDENTIALS messages
#
Socket::SO_PASSCRED: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Toggle security context passing (Linux 2.6.18)
#
Socket::SO_PASSSEC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set the peek offset (Linux 3.4)
#
Socket::SO_PEEK_OFF: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The credentials of the foreign process connected to this socket
#
Socket::SO_PEERCRED: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Name of the connecting user
#
Socket::SO_PEERNAME: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Obtain the security credentials (Linux 2.6.2)
#
Socket::SO_PEERSEC: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# The protocol-defined priority for all packets on this socket
#
Socket::SO_PRIORITY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Protocol given for socket() (Linux 2.6.32)
#
Socket::SO_PROTOCOL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive buffer size
#
Socket::SO_RCVBUF: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive buffer size without rmem_max limit (Linux 2.6.14)
#
Socket::SO_RCVBUFFORCE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive low-water mark
#
Socket::SO_RCVLOWAT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive timeout
#
Socket::SO_RCVTIMEO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive user credentials with datagram
#
Socket::SO_RECVUCRED: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Allow local address reuse
#
Socket::SO_REUSEADDR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Allow local address and port reuse
#
Socket::SO_REUSEPORT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set the routing table for this socket (OpenBSD)
#
Socket::SO_RTABLE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Toggle cmsg for number of packets dropped (Linux 2.6.33)
#
Socket::SO_RXQ_OVFL: Integer
Socket::SO_SECURITY_AUTHENTICATION: Integer
Socket::SO_SECURITY_ENCRYPTION_NETWORK: Integer
Socket::SO_SECURITY_ENCRYPTION_TRANSPORT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Make select() detect socket error queue with errorfds (Linux 3.10)
#
Socket::SO_SELECT_ERR_QUEUE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set the associated routing table for the socket (FreeBSD)
#
Socket::SO_SETFIB: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Send buffer size
#
Socket::SO_SNDBUF: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Send buffer size without wmem_max limit (Linux 2.6.14)
#
Socket::SO_SNDBUFFORCE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Send low-water mark
#
Socket::SO_SNDLOWAT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Send timeout
#
Socket::SO_SNDTIMEO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive timestamp with datagrams (timeval)
#
Socket::SO_TIMESTAMP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Time stamping of incoming and outgoing packets (Linux 2.6.30)
#
Socket::SO_TIMESTAMPING: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Receive nanosecond timestamp with datagrams (timespec)
#
Socket::SO_TIMESTAMPNS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Get the socket type
#
Socket::SO_TYPE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Bypass hardware when possible
#
Socket::SO_USELOOPBACK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Setting an identifier for ipfw purpose mainly
#
Socket::SO_USER_COOKIE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Give a hint when more data is ready
#
Socket::SO_WANTMORE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# OOB data is wanted in MSG_FLAG on receive
#
Socket::SO_WANTOOBFLAG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Toggle cmsg for wifi status (Linux 3.3)
#
Socket::SO_WIFI_STATUS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Retrieve information about this socket (macOS)
#
Socket::TCP_CONNECTION_INFO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# TCP congestion control algorithm (Linux 2.6.13, glibc 2.6)
#
Socket::TCP_CONGESTION: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# TCP Cookie Transactions (Linux 2.6.33, glibc 2.18)
#
Socket::TCP_COOKIE_TRANSACTIONS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't send partial frames (Linux 2.2, glibc 2.2)
#
Socket::TCP_CORK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't notify a listening socket until data is ready (Linux 2.4, glibc 2.2)
#
Socket::TCP_DEFER_ACCEPT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Reduce step of the handshake process (Linux 3.7, glibc 2.18)
#
Socket::TCP_FASTOPEN: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Retrieve information about this socket (Linux 2.4, glibc 2.2)
#
Socket::TCP_INFO: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Idle time before keepalive probes are sent (macOS)
#
Socket::TCP_KEEPALIVE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Maximum number of keepalive probes allowed before dropping a connection (Linux
# 2.4, glibc 2.2)
#
Socket::TCP_KEEPCNT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Idle time before keepalive probes are sent (Linux 2.4, glibc 2.2)
#
Socket::TCP_KEEPIDLE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Time between keepalive probes (Linux 2.4, glibc 2.2)
#
Socket::TCP_KEEPINTVL: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Lifetime of orphaned FIN_WAIT2 sockets (Linux 2.4, glibc 2.2)
#
Socket::TCP_LINGER2: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Set maximum segment size
#
Socket::TCP_MAXSEG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Use MD5 digests (RFC2385, Linux 2.6.20, glibc 2.7)
#
Socket::TCP_MD5SIG: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't delay sending to coalesce packets
#
Socket::TCP_NODELAY: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't use TCP options
#
Socket::TCP_NOOPT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't push the last block of write
#
Socket::TCP_NOPUSH: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Sequence of a queue for repair mode (Linux 3.5, glibc 2.18)
#
Socket::TCP_QUEUE_SEQ: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Enable quickack mode (Linux 2.4.4, glibc 2.3)
#
Socket::TCP_QUICKACK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Repair mode (Linux 3.5, glibc 2.18)
#
Socket::TCP_REPAIR: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Options for repair mode (Linux 3.5, glibc 2.18)
#
Socket::TCP_REPAIR_OPTIONS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Queue for repair mode (Linux 3.5, glibc 2.18)
#
Socket::TCP_REPAIR_QUEUE: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Number of SYN retransmits before a connection is dropped (Linux 2.4, glibc
# 2.2)
#
Socket::TCP_SYNCNT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Duplicated acknowledgments handling for thin-streams (Linux 2.6.34, glibc
# 2.18)
#
Socket::TCP_THIN_DUPACK: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Linear timeouts for thin-streams (Linux 2.6.34, glibc 2.18)
#
Socket::TCP_THIN_LINEAR_TIMEOUTS: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# TCP timestamp (Linux 3.9, glibc 2.18)
#
Socket::TCP_TIMESTAMP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Max timeout before a TCP connection is aborted (Linux 2.6.37, glibc 2.18)
#
Socket::TCP_USER_TIMEOUT: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Clamp the size of the advertised window (Linux 2.4, glibc 2.2)
#
Socket::TCP_WINDOW_CLAMP: Integer

# <!-- rdoc-file=ext/socket/constdefs.c -->
# Don't send partial frames (Linux 2.5.44, glibc 2.11)
#
Socket::UDP_CORK: Integer

# <!-- rdoc-file=ext/socket/ifaddr.c -->
# Socket::Ifaddr represents a result of getifaddrs() function.
#
class Socket::Ifaddr
  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - ifaddr.addr => addrinfo
  # -->
  # Returns the address of *ifaddr*. nil is returned if address is not available
  # in *ifaddr*.
  #
  def addr: () -> Addrinfo?

  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - ifaddr.broadaddr => addrinfo
  # -->
  # Returns the broadcast address of *ifaddr*. nil is returned if the flags
  # doesn't have IFF_BROADCAST.
  #
  def broadaddr: () -> Addrinfo?

  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - ifaddr.dstaddr => addrinfo
  # -->
  # Returns the destination address of *ifaddr*. nil is returned if the flags
  # doesn't have IFF_POINTOPOINT.
  #
  def dstaddr: () -> Addrinfo?

  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - ifaddr.flags => integer
  # -->
  # Returns the flags of *ifaddr*.
  #
  def flags: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - ifaddr.ifindex => integer
  # -->
  # Returns the interface index of *ifaddr*.
  #
  def ifindex: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - ifaddr.inspect => string
  # -->
  # Returns a string to show contents of *ifaddr*.
  #
  def inspect: () -> String

  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - ifaddr.name => string
  # -->
  # Returns the interface name of *ifaddr*.
  #
  def name: () -> String

  # <!--
  #   rdoc-file=ext/socket/ifaddr.c
  #   - ifaddr.netmask => addrinfo
  # -->
  # Returns the netmask address of *ifaddr*. nil is returned if netmask is not
  # available in *ifaddr*.
  #
  def netmask: () -> Addrinfo?
end

# <!-- rdoc-file=ext/socket/lib/socket.rb -->
# UDP/IP address information used by Socket.udp_server_loop.
#
class Socket::UDPSource
  def inspect: () -> String

  # <!-- rdoc-file=ext/socket/lib/socket.rb -->
  # Local address
  #
  def local_address: () -> Addrinfo

  # <!-- rdoc-file=ext/socket/lib/socket.rb -->
  # Address of the source
  #
  def remote_address: () -> Addrinfo

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - reply(msg)
  # -->
  # Sends the String `msg` to the source
  #
  def reply: (String msg) -> void

  private

  # <!--
  #   rdoc-file=ext/socket/lib/socket.rb
  #   - new(remote_address, local_address, &reply_proc)
  # -->
  # `remote_address` is an Addrinfo object.
  #
  # `local_address` is an Addrinfo object.
  #
  # `reply_proc` is a Proc used to send reply back to the source.
  #
  def initialize: (Addrinfo remote_address, Addrinfo local_address) { (String) -> void } -> void
end

# <!-- rdoc-file=ext/socket/ancdata.c -->
# Socket::AncillaryData represents the ancillary data (control information) used
# by sendmsg and recvmsg system call.  It contains socket #family, control
# message (cmsg) #level, cmsg #type and cmsg #data.
#
class Socket::AncillaryData
  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - Socket::AncillaryData.int(family, cmsg_level, cmsg_type, integer) => ancillarydata
  # -->
  # Creates a new Socket::AncillaryData object which contains a int as data.
  #
  # The size and endian is dependent on the host.
  #
  #     require 'socket'
  #
  #     p Socket::AncillaryData.int(:UNIX, :SOCKET, :RIGHTS, STDERR.fileno)
  #     #=> #<Socket::AncillaryData: UNIX SOCKET RIGHTS 2>
  #
  def self.int: (Symbol, Symbol, Symbol, Symbol) -> instance

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - Socket::AncillaryData.ip_pktinfo(addr, ifindex) => ancdata
  #   - Socket::AncillaryData.ip_pktinfo(addr, ifindex, spec_dst) => ancdata
  # -->
  # Returns new ancillary data for IP_PKTINFO.
  #
  # If spec_dst is not given, addr is used.
  #
  # IP_PKTINFO is not standard.
  #
  # Supported platform: GNU/Linux
  #
  #     addr = Addrinfo.ip("127.0.0.1")
  #     ifindex = 0
  #     spec_dst = Addrinfo.ip("127.0.0.1")
  #     p Socket::AncillaryData.ip_pktinfo(addr, ifindex, spec_dst)
  #     #=> #<Socket::AncillaryData: INET IP PKTINFO 127.0.0.1 ifindex:0 spec_dst:127.0.0.1>
  #
  def self.ip_pktinfo: (Addrinfo addr, Integer ifindex, ?Addrinfo spec_dst) -> instance

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - Socket::AncillaryData.ipv6_pktinfo(addr, ifindex) => ancdata
  # -->
  # Returns new ancillary data for IPV6_PKTINFO.
  #
  # IPV6_PKTINFO is defined by RFC 3542.
  #
  #     addr = Addrinfo.ip("::1")
  #     ifindex = 0
  #     p Socket::AncillaryData.ipv6_pktinfo(addr, ifindex)
  #     #=> #<Socket::AncillaryData: INET6 IPV6 PKTINFO ::1 ifindex:0>
  #
  def self.ipv6_pktinfo: (Addrinfo addr, Integer ifindex) -> instance

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - Socket::AncillaryData.unix_rights(io1, io2, ...) => ancillarydata
  # -->
  # Creates a new Socket::AncillaryData object which contains file descriptors as
  # data.
  #
  #     p Socket::AncillaryData.unix_rights(STDERR)
  #     #=> #<Socket::AncillaryData: UNIX SOCKET RIGHTS 2>
  #
  def self.unix_rights: (IO fd) -> instance

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.cmsg_is?(level, type) => true or false
  # -->
  # tests the level and type of *ancillarydata*.
  #
  #     ancdata = Socket::AncillaryData.new(:INET6, :IPV6, :PKTINFO, "")
  #     ancdata.cmsg_is?(Socket::IPPROTO_IPV6, Socket::IPV6_PKTINFO) #=> true
  #     ancdata.cmsg_is?(:IPV6, :PKTINFO)       #=> true
  #     ancdata.cmsg_is?(:IP, :PKTINFO)         #=> false
  #     ancdata.cmsg_is?(:SOCKET, :RIGHTS)      #=> false
  #
  def cmsg_is?: (Integer level, Integer ancillary_type) -> bool

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.data => string
  # -->
  # returns the cmsg data as a string.
  #
  #     p Socket::AncillaryData.new(:INET6, :IPV6, :PKTINFO, "").data
  #     #=> ""
  #
  def data: () -> String

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.family => integer
  # -->
  # returns the socket family as an integer.
  #
  #     p Socket::AncillaryData.new(:INET6, :IPV6, :PKTINFO, "").family
  #     #=> 10
  #
  def family: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.inspect => string
  # -->
  # returns a string which shows ancillarydata in human-readable form.
  #
  #     p Socket::AncillaryData.new(:INET6, :IPV6, :PKTINFO, "").inspect
  #     #=> "#<Socket::AncillaryData: INET6 IPV6 PKTINFO \"\">"
  #
  def inspect: () -> String

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.int => integer
  # -->
  # Returns the data in *ancillarydata* as an int.
  #
  # The size and endian is dependent on the host.
  #
  #     ancdata = Socket::AncillaryData.int(:UNIX, :SOCKET, :RIGHTS, STDERR.fileno)
  #     p ancdata.int #=> 2
  #
  def int: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancdata.ip_pktinfo => [addr, ifindex, spec_dst]
  # -->
  # Extracts addr, ifindex and spec_dst from IP_PKTINFO ancillary data.
  #
  # IP_PKTINFO is not standard.
  #
  # Supported platform: GNU/Linux
  #
  #     addr = Addrinfo.ip("127.0.0.1")
  #     ifindex = 0
  #     spec_dest = Addrinfo.ip("127.0.0.1")
  #     ancdata = Socket::AncillaryData.ip_pktinfo(addr, ifindex, spec_dest)
  #     p ancdata.ip_pktinfo
  #     #=> [#<Addrinfo: 127.0.0.1>, 0, #<Addrinfo: 127.0.0.1>]
  #
  def ip_pktinfo: () -> [ Addrinfo, Integer, Addrinfo ]

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancdata.ipv6_pktinfo => [addr, ifindex]
  # -->
  # Extracts addr and ifindex from IPV6_PKTINFO ancillary data.
  #
  # IPV6_PKTINFO is defined by RFC 3542.
  #
  #     addr = Addrinfo.ip("::1")
  #     ifindex = 0
  #     ancdata = Socket::AncillaryData.ipv6_pktinfo(addr, ifindex)
  #     p ancdata.ipv6_pktinfo #=> [#<Addrinfo: ::1>, 0]
  #
  def ipv6_pktinfo: () -> [ Addrinfo, Integer ]

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancdata.ipv6_pktinfo_addr => addr
  # -->
  # Extracts addr from IPV6_PKTINFO ancillary data.
  #
  # IPV6_PKTINFO is defined by RFC 3542.
  #
  #     addr = Addrinfo.ip("::1")
  #     ifindex = 0
  #     ancdata = Socket::AncillaryData.ipv6_pktinfo(addr, ifindex)
  #     p ancdata.ipv6_pktinfo_addr #=> #<Addrinfo: ::1>
  #
  def ipv6_pktinfo_addr: () -> Addrinfo

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancdata.ipv6_pktinfo_ifindex => addr
  # -->
  # Extracts ifindex from IPV6_PKTINFO ancillary data.
  #
  # IPV6_PKTINFO is defined by RFC 3542.
  #
  #     addr = Addrinfo.ip("::1")
  #     ifindex = 0
  #     ancdata = Socket::AncillaryData.ipv6_pktinfo(addr, ifindex)
  #     p ancdata.ipv6_pktinfo_ifindex #=> 0
  #
  def ipv6_pktinfo_ifindex: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.level => integer
  # -->
  # returns the cmsg level as an integer.
  #
  #     p Socket::AncillaryData.new(:INET6, :IPV6, :PKTINFO, "").level
  #     #=> 41
  #
  def level: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.timestamp => time
  # -->
  # returns the timestamp as a time object.
  #
  # *ancillarydata* should be one of following type:
  # *   SOL_SOCKET/SCM_TIMESTAMP (microsecond) GNU/Linux, FreeBSD, NetBSD,
  #     OpenBSD, Solaris, MacOS X
  # *   SOL_SOCKET/SCM_TIMESTAMPNS (nanosecond) GNU/Linux
  # *   SOL_SOCKET/SCM_BINTIME (2**(-64) second) FreeBSD
  #
  #     Addrinfo.udp("127.0.0.1", 0).bind {|s1|
  #         Addrinfo.udp("127.0.0.1", 0).bind {|s2|
  #           s1.setsockopt(:SOCKET, :TIMESTAMP, true)
  #           s2.send "a", 0, s1.local_address
  #           ctl = s1.recvmsg.last
  #           p ctl    #=> #<Socket::AncillaryData: INET SOCKET TIMESTAMP 2009-02-24 17:35:46.775581>
  #           t = ctl.timestamp
  #           p t      #=> 2009-02-24 17:35:46 +0900
  #           p t.usec #=> 775581
  #           p t.nsec #=> 775581000
  #         }
  #
  #     }
  #
  def timestamp: () -> Time

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.type => integer
  # -->
  # returns the cmsg type as an integer.
  #
  #     p Socket::AncillaryData.new(:INET6, :IPV6, :PKTINFO, "").type
  #     #=> 2
  #
  def type: () -> Integer

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - ancillarydata.unix_rights => array-of-IOs or nil
  # -->
  # returns the array of IO objects for SCM_RIGHTS control message in UNIX domain
  # socket.
  #
  # The class of the IO objects in the array is IO or Socket.
  #
  # The array is attached to *ancillarydata* when it is instantiated. For example,
  # BasicSocket#recvmsg attach the array when receives a SCM_RIGHTS control
  # message and :scm_rights=>true option is given.
  #
  #     # recvmsg needs :scm_rights=>true for unix_rights
  #     s1, s2 = UNIXSocket.pair
  #     p s1                                         #=> #<UNIXSocket:fd 3>
  #     s1.sendmsg "stdin and a socket", 0, nil, Socket::AncillaryData.unix_rights(STDIN, s1)
  #     _, _, _, ctl = s2.recvmsg(:scm_rights=>true)
  #     p ctl                                        #=> #<Socket::AncillaryData: UNIX SOCKET RIGHTS 6 7>
  #     p ctl.unix_rights                            #=> [#<IO:fd 6>, #<Socket:fd 7>]
  #     p File.identical?(STDIN, ctl.unix_rights[0]) #=> true
  #     p File.identical?(s1, ctl.unix_rights[1])    #=> true
  #
  #     # If :scm_rights=>true is not given, unix_rights returns nil
  #     s1, s2 = UNIXSocket.pair
  #     s1.sendmsg "stdin and a socket", 0, nil, Socket::AncillaryData.unix_rights(STDIN, s1)
  #     _, _, _, ctl = s2.recvmsg
  #     p ctl #=> #<Socket::AncillaryData: UNIX SOCKET RIGHTS 6 7>
  #     p ctl.unix_rights #=> nil
  #
  def unix_rights: () -> Array[IO]?

  private

  # <!--
  #   rdoc-file=ext/socket/ancdata.c
  #   - Socket::AncillaryData.new(family, cmsg_level, cmsg_type, cmsg_data) -> ancillarydata
  # -->
  # *family* should be an integer, a string or a symbol.
  # *   Socket::AF_INET, "AF_INET", "INET", :AF_INET, :INET
  # *   Socket::AF_UNIX, "AF_UNIX", "UNIX", :AF_UNIX, :UNIX
  # *   etc.
  #
  # *cmsg_level* should be an integer, a string or a symbol.
  # *   Socket::SOL_SOCKET, "SOL_SOCKET", "SOCKET", :SOL_SOCKET and :SOCKET
  # *   Socket::IPPROTO_IP, "IP" and :IP
  # *   Socket::IPPROTO_IPV6, "IPV6" and :IPV6
  # *   Socket::IPPROTO_TCP, "TCP" and :TCP
  # *   etc.
  #
  # *cmsg_type* should be an integer, a string or a symbol. If a string/symbol is
  # specified, it is interpreted depend on *cmsg_level*.
  # *   Socket::SCM_RIGHTS, "SCM_RIGHTS", "RIGHTS", :SCM_RIGHTS, :RIGHTS for
  #     SOL_SOCKET
  # *   Socket::IP_RECVTTL, "RECVTTL" and :RECVTTL for IPPROTO_IP
  # *   Socket::IPV6_PKTINFO, "PKTINFO" and :PKTINFO for IPPROTO_IPV6
  # *   etc.
  #
  # *cmsg_data* should be a string.
  #
  #     p Socket::AncillaryData.new(:INET, :TCP, :NODELAY, "")
  #     #=> #<Socket::AncillaryData: INET TCP NODELAY "">
  #
  #     p Socket::AncillaryData.new(:INET6, :IPV6, :PKTINFO, "")
  #     #=> #<Socket::AncillaryData: INET6 IPV6 PKTINFO "">
  #
  def initialize: (interned | Integer family, interned | Integer cmsg_level, interned | Integer cmsg_data, String cmsg_data) -> untyped
end
