trusty (3) inet.3erl.gz

Provided by: erlang-manpages_16.b.3-dfsg-1ubuntu2.2_all bug

NAME

       inet - Access to TCP/IP Protocols

DESCRIPTION

       Provides access to TCP/IP protocols.

       See also ERTS User's Guide, Inet configuration for more information on how to configure an Erlang runtime
       system for IP communication.

       Two Kernel configuration parameters affect the behaviour  of  all  sockets  opened  on  an  Erlang  node:
       inet_default_connect_options  can  contain  a  list of default options used for all sockets returned when
       doing connect, and inet_default_listen_options can contain a list of default options used when issuing  a
       listen  call.  When  accept  is issued, the values of the listensocket options are inherited, why no such
       application variable is needed for accept.

       Using the Kernel configuration parameters mentioned above, one  can  set  default  options  for  all  TCP
       sockets  on  a node. This should be used with care, but options like {delay_send,true} might be specified
       in this way. An example of starting an Erlang node with all sockets using delayed send  could  look  like
       this:

       $ erl -sname test -kernel \
       inet_default_connect_options '[{delay_send,true}]' \
       inet_default_listen_options '[{delay_send,true}]'

       Note that the default option {active, true} currently cannot be changed, for internal reasons.

       Addresses  as  inputs  to  functions  can  be  either  a  string or a tuple. For instance, the IP address
       150.236.20.73 can be passed to gethostbyaddr/1 either as the string "150.236.20.73" or as the tuple {150,
       236, 20, 73}.

       IPv4 address examples:

       Address          ip_address()
       -------          ------------
       127.0.0.1        {127,0,0,1}
       192.168.42.2     {192,168,42,2}

       IPv6 address examples:

       Address          ip_address()
       -------          ------------
       ::1             {0,0,0,0,0,0,0,1}
       ::192.168.42.2  {0,0,0,0,0,0,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
       FFFF::192.168.42.2
                       {16#FFFF,0,0,0,0,0,(192 bsl 8) bor 168,(42 bsl 8) bor 2}
       3ffe:b80:1f8d:2:204:acff:fe17:bf38
                       {16#3ffe,16#b80,16#1f8d,16#2,16#204,16#acff,16#fe17,16#bf38}
       fe80::204:acff:fe17:bf38
                       {16#fe80,0,0,0,0,16#204,16#acff,16#fe17,16#bf38}

       A function that may be useful is parse_address/1:

       1> inet:parse_address("192.168.42.2").
       {ok,{192,168,42,2}}
       2> inet:parse_address("FFFF::192.168.42.2").
       {ok,{65535,0,0,0,0,0,49320,10754}}

DATA TYPES

       hostent() =
           #hostent{h_name = undefined | inet:hostname(),
                    h_aliases = [inet:hostname()],
                    h_addrtype = undefined | inet | inet6,
                    h_length = undefined | integer() >= 0,
                    h_addr_list = [inet:ip_address()]}

              The  record  is  defined in the Kernel include file "inet.hrl". Add the following directive to the
              module:

              -include_lib("kernel/include/inet.hrl").

       hostname() = atom() | string()

       ip_address() = ip4_address() | ip6_address()

       ip4_address() = {0..255, 0..255, 0..255, 0..255}

       ip6_address() =
           {0..65535,
            0..65535,
            0..65535,
            0..65535,
            0..65535,
            0..65535,
            0..65535,
            0..65535}

       port_number() = 0..65535

       posix() = exbadport | exbadseq | file:posix()

              An atom which is named from the Posix error codes used in Unix, and in the  runtime  libraries  of
              most C compilers. See POSIX Error Codes.

       socket()

              See gen_tcp(3erl) and gen_udp(3erl).

       address_family() = inet | inet6

EXPORTS

       close(Socket) -> ok

              Types:

                 Socket = socket()

              Closes a socket of any type.

       get_rc() -> [{Par :: any(), Val :: any()}]

              Returns  the  state of the Inet configuration database in form of a list of recorded configuration
              parameters. (See the ERTS User's Guide, Inet configuration, for more information). Only parameters
              with other than default values are returned.

       format_error(Reason) -> string()

              Types:

                 Reason = posix() | system_limit

              Returns  a  diagnostic  error  string.  See  the  section  below for possible Posix values and the
              corresponding strings.

       getaddr(Host, Family) -> {ok, Address} | {error, posix()}

              Types:

                 Host = ip_address() | hostname()
                 Family = address_family()
                 Address = ip_address()

              Returns the IP-address for Host as a tuple of integers.  Host  can  be  an  IP-address,  a  single
              hostname or a fully qualified hostname.

       getaddrs(Host, Family) -> {ok, Addresses} | {error, posix()}

              Types:

                 Host = ip_address() | hostname()
                 Family = address_family()
                 Addresses = [ip_address()]

              Returns  a  list  of  all IP-addresses for Host. Host can be an IP-address, a single hostname or a
              fully qualified hostname.

       gethostbyaddr(Address) -> {ok, Hostent} | {error, posix()}

              Types:

                 Address = string() | ip_address()
                 Hostent = hostent()

              Returns a hostent record given an address.

       gethostbyname(Hostname) -> {ok, Hostent} | {error, posix()}

              Types:

                 Hostname = hostname()
                 Hostent = hostent()

              Returns a hostent record given a hostname.

       gethostbyname(Hostname, Family) ->
                        {ok, Hostent} | {error, posix()}

              Types:

                 Hostname = hostname()
                 Family = address_family()
                 Hostent = hostent()

              Returns a hostent record given a hostname, restricted to the given address family.

       gethostname() -> {ok, Hostname}

              Types:

                 Hostname = string()

              Returns the local hostname. Will never fail.

       getifaddrs() -> {ok, Iflist} | {error, posix()}

              Types:

                 Iflist = [{Ifname, [Ifopt]}]
                 Ifname = string()
                 Ifopt = {flag, [Flag]}
                       | {addr, Addr}
                       | {netmask, Netmask}
                       | {broadaddr, Broadaddr}
                       | {dstaddr, Dstaddr}
                       | {hwaddr, Hwaddr}
                 Flag = up
                      | broadcast
                      | loopback
                      | pointtopoint
                      | running
                      | multicast
                 Addr = Netmask = Broadaddr = Dstaddr = ip_address()
                 Hwaddr = [byte()]

              Returns a list of 2-tuples containing interface names and the interface's addresses. Ifname  is  a
              Unicode string. Hwaddr is hardware dependent, e.g on Ethernet interfaces it is the 6-byte Ethernet
              address (MAC address (EUI-48 address)).

              The {addr,Addr}, {netmask,_} and {broadaddr,_} tuples are repeated in  the  result  list  iff  the
              interface  has  multiple  addresses. If you come across an interface that has multiple {flag,_} or
              {hwaddr,_} tuples you have a really strange interface or possibly a  bug  in  this  function.  The
              {flag,_} tuple is mandatory, all other optional.

              Do not rely too much on the order of Flag atoms or Ifopt tuples. There are some rules, though:

                *
                   Immediately after {addr,_} follows {netmask,_}

                *
                   Immediately  thereafter  follows  {broadaddr,_}  if  the  broadcast  flag  is not set and the
                  pointtopoint flag is set.

                *
                   Any {netmask,_}, {broadaddr,_} or {dstaddr,_} tuples that follow an {addr,_}  tuple  concerns
                  that address.

              The {hwaddr,_} tuple is not returned on Solaris since the hardware address historically belongs to
              the link layer and only the superuser can read such addresses.

              On Windows, the data is fetched from  quite  different  OS  API  functions,  so  the  Netmask  and
              Broadaddr  values  may  be  calculated,  just  as  some  Flag values. You have been warned. Report
              flagrant bugs.

       getopts(Socket, Options) -> {ok, OptionValues} | {error, posix()}

              Types:

                 Socket = socket()
                 Options = [socket_getopt()]
                 OptionValues = [socket_setopt()]
                 socket_getopt() = gen_sctp:option_name()
                                 | gen_tcp:option_name()
                                 | gen_udp:option_name()
                 socket_setopt() = gen_sctp:option()
                                 | gen_tcp:option()
                                 | gen_udp:option()

              Gets one or more options for a socket. See setopts/2 for a list of available options.

              The number of elements in the returned OptionValues list does not necessarily  correspond  to  the
              number of options asked for. If the operating system fails to support an option, it is simply left
              out in the returned list. An error tuple is only returned when getting options for the  socket  is
              impossible  (i.e.  the  socket  is  closed or the buffer size in a raw request is too large). This
              behavior is kept for backward compatibility reasons.

              A raw option request RawOptReq =  {raw,  Protocol,  OptionNum,  ValueSpec}  can  be  used  to  get
              information about socket options not (explicitly) supported by the emulator. The use of raw socket
              options makes the code non portable, but allows the Erlang programmer to take advantage of unusual
              features present on the current platform.

              The RawOptReq consists of the tag raw followed by the protocol level, the option number and either
              a binary or the size, in bytes, of the buffer in which the option value is to be stored. A  binary
              should  be used when the underlying getsockopt requires input in the argument field, in which case
              the size of the binary should correspond to the required buffer size  of  the  return  value.  The
              supplied  values in a RawOptReq correspond to the second, third and fourth/fifth parameters to the
              getsockopt call in the C socket API. The value stored in  the  buffer  is  returned  as  a  binary
              ValueBin where all values are coded in the native endianess.

              Asking  for  and  inspecting  raw  socket  options require low level information about the current
              operating system and TCP stack.

              As an example, consider a Linux machine where the TCP_INFO option could be  used  to  collect  TCP
              statistics for a socket. Lets say we're interested in the tcpi_sacked field of the struct tcp_info
              filled in when asking for TCP_INFO. To be able to access this information, we need  to  know  both
              the numeric value of the protocol level IPPROTO_TCP, the numeric value of the option TCP_INFO, the
              size of the struct tcp_info and the size and offset of  the  specific  field.  By  inspecting  the
              headers  or  writing  a  small  C  program,  we  found IPPROTO_TCP to be 6, TCP_INFO to be 11, the
              structure size to be 92 (bytes), the offset of tcpi_sacked to be 28 bytes and the actual value  to
              be a 32 bit integer. We could use the following code to retrieve the value:

                      get_tcpi_sacked(Sock) ->
                          {ok,[{raw,_,_,Info}]} = inet:getopts(Sock,[{raw,6,11,92}]),
                          <<_:28/binary,TcpiSacked:32/native,_/binary>> = Info,
                          TcpiSacked.

              Preferably,  you  would  check  the machine type, the OS and the kernel version prior to executing
              anything similar to the code above.

       getstat(Socket) -> {ok, OptionValues} | {error, posix()}

       getstat(Socket, Options) -> {ok, OptionValues} | {error, posix()}

              Types:

                 Socket = socket()
                 Options = [stat_option()]
                 OptionValues = [{stat_option(), integer()}]
                 stat_option() = recv_cnt
                               | recv_max
                               | recv_avg
                               | recv_oct
                               | recv_dvi
                               | send_cnt
                               | send_max
                               | send_avg
                               | send_oct
                               | send_pend

              Gets one or more statistic options for a socket.

              getstat(Socket)  is  equivalent  to  getstat(Socket,  [recv_avg,  recv_cnt,  recv_dvi,   recv_max,
              recv_oct, send_avg, send_cnt, send_dvi, send_max, send_oct]).

              The following options are available:

                recv_avg:
                  Average size of packets in bytes received to the socket.

                recv_cnt:
                  Number of packets received to the socket.

                recv_dvi:
                  Average packet size deviation in bytes received to the socket.

                recv_max:
                  The size of the largest packet in bytes received to the socket.

                recv_oct:
                  Number of bytes received to the socket.

                send_avg:
                  Average size of packets in bytes sent from the socket.

                send_cnt:
                  Number of packets sent from the socket.

                send_dvi:
                  Average packet size deviation in bytes received sent from the socket.

                send_max:
                  The size of the largest packet in bytes sent from the socket.

                send_oct:
                  Number of bytes sent from the socket.

       ntoa(IpAddress) -> {ok, Address} | {error, einval}

              Types:

                 Address = string()
                 IpAddress = ip_address()

              Parses an ip_address() and returns an IPv4 or IPv6 address string.

       parse_ipv4_address(Address) -> {ok, IPv4Address} | {error, einval}

              Types:

                 Address = string()
                 IPv4Address = ip_address()

              Parses  an  IPv4  address  string and returns an ip4_address(). Accepts a shortened IPv4 shortened
              address string.

       parse_ipv4strict_address(Address) ->
                                   {ok, IPv4Address} | {error, einval}

              Types:

                 Address = string()
                 IPv4Address = ip_address()

              Parses an IPv4 address  string  containing  four  fields,  i.e  not   shortened,  and  returns  an
              ip4_address().

       parse_ipv6_address(Address) -> {ok, IPv6Address} | {error, einval}

              Types:

                 Address = string()
                 IPv6Address = ip_address()

              Parses  an  IPv6 address string and returns an ip6_address(). If an IPv4 address string is passed,
              an IPv4-mapped IPv6 address is returned.

       parse_ipv6strict_address(Address) ->
                                   {ok, IPv6Address} | {error, einval}

              Types:

                 Address = string()
                 IPv6Address = ip_address()

              Parses an IPv6 address string and returns an ip6_address(). Does not  accept IPv4 adresses.

       parse_address(Address) -> {ok, IPAddress} | {error, einval}

              Types:

                 Address = string()
                 IPAddress = ip_address()

              Parses an IPv4 or IPv6 address string and returns an ip4_address()  or  ip6_address().  Accepts  a
              shortened IPv4 address string.

       parse_strict_address(Address) -> {ok, IPAddress} | {error, einval}

              Types:

                 Address = string()
                 IPAddress = ip_address()

              Parses  an  IPv4  or  IPv6  address string and returns an ip4_address() or ip6_address(). Does not
              accept a shortened IPv4 address string.

       peername(Socket) -> {ok, {Address, Port}} | {error, posix()}

              Types:

                 Socket = socket()
                 Address = ip_address()
                 Port = integer() >= 0

              Returns the address and port for the other end of a connection.

              Note that for SCTP sockets this function only returns one of  the  socket's  peer  addresses.  The
              function peernames/1,2 returns all.

       peernames(Socket) -> {ok, [{Address, Port}]} | {error, posix()}

              Types:

                 Socket = socket()
                 Address = ip_address()
                 Port = integer() >= 0

              Equivalent  to  peernames(Socket,  0). Note that this function's behaviour for an SCTP one-to-many
              style socket is not defined by the SCTP Sockets API Extensions.

       peernames(Socket, Assoc) ->
                    {ok, [{Address, Port}]} | {error, posix()}

              Types:

                 Socket = socket()
                 Assoc = #sctp_assoc_change{} | gen_sctp:assoc_id()
                 Address = ip_address()
                 Port = integer() >= 0

              Returns a list of all address/port number pairs for the other end of a socket's association Assoc.

              This function can return multiple addresses for multihomed sockets such as SCTP sockets. For other
              sockets it returns a one element list.

              Note that the Assoc parameter is by the SCTP Sockets API Extensions defined to be ignored for one-
              to-one style sockets. What the special value 0 means hence its  behaviour  for  one-to-many  style
              sockets is unfortunately not defined.

       port(Socket) -> {ok, Port} | {error, any()}

              Types:

                 Socket = socket()
                 Port = port_number()

              Returns the local port number for a socket.

       sockname(Socket) -> {ok, {Address, Port}} | {error, posix()}

              Types:

                 Socket = socket()
                 Address = ip_address()
                 Port = integer() >= 0

              Returns the local address and port number for a socket.

              Note  that  for  SCTP sockets this function only returns one of the socket addresses. The function
              socknames/1,2 returns all.

       socknames(Socket) -> {ok, [{Address, Port}]} | {error, posix()}

              Types:

                 Socket = socket()
                 Address = ip_address()
                 Port = integer() >= 0

              Equivalent to socknames(Socket, 0).

       socknames(Socket, Assoc) ->
                    {ok, [{Address, Port}]} | {error, posix()}

              Types:

                 Socket = socket()
                 Assoc = #sctp_assoc_change{} | gen_sctp:assoc_id()
                 Address = ip_address()
                 Port = integer() >= 0

              Returns a list of all local address/port number pairs for  a  socket  for  the  given  association
              Assoc.

              This function can return multiple addresses for multihomed sockets such as SCTP sockets. For other
              sockets it returns a one element list.

              Note that the Assoc parameter is by the SCTP Sockets API Extensions defined to be ignored for one-
              to-one  style  sockets.  For one-to-many style sockets the special value 0 is defined to mean that
              the returned addresses shall be without regard to any particular association. How  different  SCTP
              implementations interprets this varies somewhat.

       setopts(Socket, Options) -> ok | {error, posix()}

              Types:

                 Socket = socket()
                 Options = [socket_setopt()]
                 socket_setopt() = gen_sctp:option()
                                 | gen_tcp:option()
                                 | gen_udp:option()

              Sets one or more options for a socket. The following options are available:

                {active, true | false | once}:
                  If  the  value is true, which is the default, everything received from the socket will be sent
                  as messages to the receiving process. If the value is false (passive mode), the  process  must
                  explicitly receive incoming data by calling gen_tcp:recv/2,3 or gen_udp:recv/2,3 (depending on
                  the type of socket).

                  If the value is once ({active, once}), one data message from the socket will be  sent  to  the
                  process.  To  receive one more message, setopts/2 must be called again with the {active, once}
                  option.

                  When using {active, once}, the socket changes behaviour automatically when data  is  received.
                  This can sometimes be confusing in combination with connection oriented sockets (i.e. gen_tcp)
                  as a socket with {active, false} behaviour reports closing  differently  than  a  socket  with
                  {active,  true} behaviour. To make programming easier, a socket where the peer closed and this
                  was  detected  while  in   {active,   false}   mode,   will   still   generate   the   message
                  {tcp_closed,Socket} when set to {active, once} or {active, true} mode. It is therefore safe to
                  assume that the message {tcp_closed,Socket}, possibly  followed  by  socket  port  termination
                  (depending  on the exit_on_close option) will eventually appear when a socket changes back and
                  forth between {active, true} and {active, false} mode. However, when peer closing is  detected
                  is all up to the underlying TCP/IP stack and protocol.

                  Note that {active,true} mode provides no flow control; a fast sender could easily overflow the
                  receiver with incoming messages. Use active mode only if your high-level protocol provides its
                  own  flow  control  (for  instance,  acknowledging  received  messages)  or the amount of data
                  exchanged is small. {active,false} mode or use  of  the  {active,  once}  mode  provides  flow
                  control; the other side will not be able send faster than the receiver can read.

                {broadcast, Boolean}(UDP sockets):
                  Enable/disable permission to send broadcasts.

                {buffer, Size}:
                  Determines  the  size of the user-level software buffer used by the driver. Not to be confused
                  with sndbuf and  recbuf  options  which  correspond  to  the  kernel  socket  buffers.  It  is
                  recommended  to  have val(buffer) >= max(val(sndbuf),val(recbuf)). In fact, the val(buffer) is
                  automatically set to the above maximum when sndbuf or recbuf values are set.

                {delay_send, Boolean}:
                  Normally, when an Erlang process sends to a socket, the driver will try  to  immediately  send
                  the data. If that fails, the driver will use any means available to queue up the message to be
                  sent whenever the operating system says it can handle it. Setting {delay_send, true} will make
                  all  messages  queue  up. This makes the messages actually sent onto the network be larger but
                  fewer. The option actually affects the scheduling of send  requests  versus  Erlang  processes
                  instead  of  changing any real property of the socket. Needless to say it is an implementation
                  specific option. Default is false.

                {deliver, port | term}:
                  When {active, true} delivers data on the forms port : {S, {data, [H1,..Hsz | Data]}} or term :
                  {tcp, S, [H1..Hsz | Data]}.

                {dontroute, Boolean}:
                  Enable/disable routing bypass for outgoing messages.

                {exit_on_close, Boolean}:
                  By default this option is set to true.

                  The only reason to set it to false is if you want to continue sending data to the socket after
                  a close has been detected, for instance if the peer has used  gen_tcp:shutdown/2  to  shutdown
                  the write side.

                {header, Size}:
                  This option is only meaningful if the binary option was specified when the socket was created.
                  If the header option is specified, the first Size number  bytes  of  data  received  from  the
                  socket will be elements of a list, and the rest of the data will be a binary given as the tail
                  of the same list. If for example Size == 2, the data received will match [Byte1,Byte2|Binary].

                {high_msgq_watermark, Size}:
                  The socket message queue will be set into a busy state when the amount of data queued  on  the
                  message  queue  reaches  this limit. Note that this limit only concerns data that have not yet
                  reached the ERTS internal socket implementation. Default value used is 8 kB.

                  Senders of data to the socket will be suspended if either the socket message queue is busy, or
                  the socket itself is busy.

                  For more information see the low_msgq_watermark, high_watermark, and low_watermark options.

                  Note   that   distribution   sockets   will   disable   the  use  of  high_msgq_watermark  and
                  low_msgq_watermark, and will instead use the distribution buffer busy limit which is a similar
                  feature.

                {high_watermark, Size} (TCP/IP sockets):
                  The socket will be set into a busy state when the amount of data queued internally by the ERTS
                  socket implementation reaches this limit. Default value used is 8 kB.

                  Senders of data to the socket will be suspended if either the socket message queue is busy, or
                  the socket itself is busy.

                  For  more  information  see  the  low_watermark,  high_msgq_watermark,  and low_msqg_watermark
                  options.

                {ipv6_v6only, Boolean}:
                  Restricts the socket to only  use  IPv6,  prohibiting  any  IPv4  connections.  This  is  only
                  applicable for IPv6 sockets (option inet6).

                  On most platforms this option has to be set on the socket before associating it to an address.
                  Therefore it is only reasonable to give it when creating the socket and not  to  use  it  when
                  calling the function (setopts/2) containing this description.

                  The  behaviour  of  a socket with this socket option set to true is becoming the only portable
                  one. The original idea when IPv6 was new of using IPv6 for all traffic is now not  recommended
                  by FreeBSD (you can use {ipv6_v6only,false} to override the recommended system default value),
                  forbidden by OpenBSD (the supported GENERIC  kernel)  and  impossible  on  Windows  (that  has
                  separate  IPv4 and IPv6 protocol stacks). Most Linux distros still have a system default value
                  of false. This policy shift among operating systems towards separating IPv6 from IPv4  traffic
                  has  evolved since it gradually proved hard and complicated to get a dual stack implementation
                  correct and secure.

                  On some platforms the only allowed value for this option is true, e.g.  OpenBSD  and  Windows.
                  Trying to set this option to false when creating the socket will in this case fail.

                  Setting  this  option  on platforms where it does not exist is ignored and getting this option
                  with getopts/2 returns no value i.e the returned list  will  not  contain  an  {ipv6_v6only,_}
                  tuple.  On  Windows the option acually does not exist, but it is emulated as being a read-only
                  option with the value true.

                  So it boils down to that setting this option to true when creating a socket  will  never  fail
                  except  possibly  (at  the  time  of this writing) on a platform where you have customized the
                  kernel to only allow false, which might be doable (but weird) on e.g. OpenBSD.

                  If you read back the option value using getopts/2 and get no value the option does  not  exist
                  in the host OS and all bets are off regarding the behaviour of both an IPv6 and an IPv4 socket
                  listening on the same port as well as for an IPv6 socket getting IPv4 traffic.

                {keepalive, Boolean}(TCP/IP sockets):
                  Enables/disables periodic transmission on a connected socket, when  no  other  data  is  being
                  exchanged. If the other end does not respond, the connection is considered broken and an error
                  message will be sent to the controlling process. Default disabled.

                {linger, {true|false, Seconds}}:
                  Determines the timeout in seconds for flushing unsent data in the close/1 socket call. If  the
                  1st  component  of  the value tuple is false, the 2nd one is ignored, which means that close/1
                  returns immediately not waiting for data to be flushed. Otherwise, the 2nd  component  is  the
                  flushing time-out in seconds.

                {low_msgq_watermark, Size}:
                  If  the socket message queue is in a busy state, the socket message queue will be set in a not
                  busy state when the amount of data queued in the message queue falls below  this  limit.  Note
                  that  this  limit  only  concerns  data  that  have  not  yet reached the ERTS internal socket
                  implementation. Default value used is 4 kB.

                  Senders that have been suspended due to either a busy message queue or a busy socket, will  be
                  resumed when neither the socket message queue, nor the socket are busy.

                  For more information see the high_msgq_watermark, high_watermark, and low_watermark options.

                  Note   that   distribution   sockets   will   disable   the  use  of  high_msgq_watermark  and
                  low_msgq_watermark, and will instead use the distribution buffer busy limit which is a similar
                  feature.

                {low_watermark, Size} (TCP/IP sockets):
                  If  the  socket is in a busy state, the socket will be set in a not busy state when the amount
                  of data queued internally by the ERTS socket implementation falls below  this  limit.  Default
                  value used is 4 kB.

                  Senders  that have been suspended due to either a busy message queue or a busy socket, will be
                  resumed when neither the socket message queue, nor the socket are busy.

                  For more information  see  the  high_watermark,  high_msgq_watermark,  and  low_msgq_watermark
                  options.

                {mode, Mode :: binary | list}:
                  Received Packet is delivered as defined by Mode.

                {netns, Namespace :: file:filename_all()}:
                  Set  a  network  namespace  for the socket. The Namespace parameter is a filename defining the
                  namespace for example "/var/run/netns/example" typically created by the command ip  netns  add
                  example.   This   option  must  be  used  in  a  function  call  that  creates  a  socket  i.e
                  gen_tcp:connect/3,4,  gen_tcp:listen/2,  gen_udp:open/1,2 or  gen_sctp:open/0-2.

                  This option uses the Linux specific syscall setns() such as in Linux kernel 3.0 or  later  and
                  therefore only exists when the runtime system has been compiled for such an operating system.

                  The  virtual machine also needs elevated privileges either running as superuser or (for Linux)
                  having the capability CAP_SYS_ADMIN according to  the  documentation  for  setns(2).  However,
                  during  testing  also  CAP_SYS_PTRACE  and  CAP_DAC_READ_SEARCH  has  proven  to be necessary.
                  Example:

                  setcap cap_sys_admin,cap_sys_ptrace,cap_dac_read_search+epi beam.smp

                  The Namespace is a file name and is encoded and decoded as discussed in file except  that  the
                  emulator  flag  +fnu  is  ignored  and  getopts/2 for this option will return a binary for the
                  filename if the stored filename can not be decoded, which should only happen if  you  set  the
                  option  using  a  binary  that  can  not  be  decoded  with  the emulator's filename encoding:
                  file:native_name_encoding/0.

                list:
                  Received Packet is delivered as a list.

                binary:
                  Received Packet is delivered as a binary.

                {nodelay, Boolean}(TCP/IP sockets):
                  If Boolean == true, the TCP_NODELAY option is turned on for the socket, which means that  even
                  small amounts of data will be sent immediately.

                {packet, PacketType}(TCP/IP sockets):
                  Defines the type of packets to use for a socket. The following values are valid:

                  raw | 0:
                    No packaging is done.

                  1 | 2 | 4:
                    Packets  consist  of a header specifying the number of bytes in the packet, followed by that
                    number of bytes. The length of header can be one, two, or four bytes; containing an unsigned
                    integer  in  big-endian  byte  order.  Each send operation will generate the header, and the
                    header will be stripped off on each receive operation.

                    In current implementation the 4-byte header is limited to 2Gb.

                  asn1 | cdr | sunrm | fcgi | tpkt | line:
                    These packet types only have  effect  on  receiving.  When  sending  a  packet,  it  is  the
                    responsibility  of  the application to supply a correct header. On receiving, however, there
                    will be one message sent to the controlling process for each complete packet received,  and,
                    similarly,  each  call  to  gen_tcp:recv/2,3  returns one complete packet. The header is not
                    stripped off.

                    The meanings of the packet types are as follows:
                    asn1 - ASN.1 BER,
                    sunrm - Sun's RPC encoding,
                    cdr - CORBA (GIOP 1.1),
                    fcgi - Fast CGI,
                    tpkt - TPKT format [RFC1006],
                    line - Line mode, a packet is a line terminated with newline, lines longer than the  receive
                    buffer are truncated.

                  http | http_bin:
                    The  Hypertext  Transfer  Protocol.  The  packets  are returned with the format according to
                    HttpPacket described in  erlang:decode_packet/3. A socket in passive mode will  return  {ok,
                    HttpPacket}  from gen_tcp:recv while an active socket will send messages like {http, Socket,
                    HttpPacket}.

                  httph | httph_bin:
                    These two types  are  often  not  needed  as  the  socket  will  automatically  switch  from
                    http/http_bin  to httph/httph_bin internally after the first line has been read. There might
                    be occasions however when they are useful, such as parsing trailers from chunked encoding.

                {packet_size, Integer}(TCP/IP sockets):
                  Sets the max allowed length of the packet body. If the packet header indicates that the length
                  of  the  packet  is  longer than the max allowed length, the packet is considered invalid. The
                  same happens if the packet header is too big for the socket receive buffer.

                  For line oriented protocols (line,http*), option packet_size also guarantees that lines up  to
                  the  indicated  length  are  accepted  and  not  considered  invalid  due  to  internal buffer
                  limitations.

                {priority, Priority}:
                  Set the protocol-defined priority for all packets to be sent on this socket.

                {raw, Protocol, OptionNum, ValueBin}:
                  See below.

                {read_packets, Integer}(UDP sockets):
                  Sets the max number of UDP packets to read without intervention from the socket when  data  is
                  available. When this many packets have been read and delivered to the destination process, new
                  packets are not read until a new notification of available data has arrived. The default is 5,
                  and  if  this  parameter  is set too high the system can become unresponsive due to UDP packet
                  flooding.

                {recbuf, Size}:
                  Gives the size of the receive buffer to use for the socket.

                {reuseaddr, Boolean}:
                  Allows or disallows local reuse of port numbers. By default, reuse is disallowed.

                {send_timeout, Integer}:
                  Only allowed for connection oriented sockets.

                  Specifies a longest time to wait for a send operation to be accepted  by  the  underlying  TCP
                  stack. When the limit is exceeded, the send operation will return {error,timeout}. How much of
                  a packet that actually got sent is unknown, why the socket should be closed whenever a timeout
                  has occurred (see send_timeout_close). Default is infinity.

                {send_timeout_close, Boolean}:
                  Only allowed for connection oriented sockets.

                  Used  together  with  send_timeout  to specify whether the socket will be automatically closed
                  when the send operation returns {error,timeout}. The recommended setting is  true  which  will
                  automatically close the socket. Default is false due to backward compatibility.

                {sndbuf, Size}:
                  Gives the size of the send buffer to use for the socket.

                {priority, Integer}:
                  Sets the SO_PRIORITY socket level option on platforms where this is implemented. The behaviour
                  and allowed range varies on different systems. The option is ignored on  platforms  where  the
                  option is not implemented. Use with caution.

                {tos, Integer}:
                  Sets IP_TOS IP level options on platforms where this is implemented. The behaviour and allowed
                  range varies on different systems. The option is ignored on platforms where the option is  not
                  implemented. Use with caution.

              In addition to the options mentioned above, raw option specifications can be used. The raw options
              are specified as a tuple of arity four, beginning with the  tag  raw,  followed  by  the  protocol
              level,  the  option  number and the actual option value specified as a binary. This corresponds to
              the second, third and fourth argument to the setsockopt call in the C socket API. The option value
              needs  to  be coded in the native endianess of the platform and, if a structure is required, needs
              to follow the struct alignment conventions on the specific platform.

              Using raw socket options require detailed knowledge about the current  operating  system  and  TCP
              stack.

              As  an  example  of  the  usage  of raw options, consider a Linux system where you want to set the
              TCP_LINGER2 option on the IPPROTO_TCP  protocol  level  in  the  stack.  You  know  that  on  this
              particular  system  it  defaults  to  60  (seconds),  but  you  would like to lower it to 30 for a
              particular socket. The TCP_LINGER2 option is not explicitly supported by inet, but you  know  that
              the  protocol level translates to the number 6, the option number to the number 8 and the value is
              to be given as a 32 bit integer. You can use this line of code to set the option  for  the  socket
              named Sock:

                      inet:setopts(Sock,[{raw,6,8,<<30:32/native>>}]),

              As  many options are silently discarded by the stack if they are given out of range, it could be a
              good idea to check that a raw option really got accepted.  This  code  places  the  value  in  the
              variable TcpLinger2:

                      {ok,[{raw,6,8,<<TcpLinger2:32/native>>}]}=inet:getopts(Sock,[{raw,6,8,4}]),

              Code such as the examples above is inherently non portable, even different versions of the same OS
              on the same platform may respond differently to this kind of option manipulation. Use with care.

              Note that the default options for TCP/IP sockets can be  changed  with  the  Kernel  configuration
              parameters mentioned in the beginning of this document.

POSIX ERROR CODES

         * e2big - argument list too long

         * eacces - permission denied

         * eaddrinuse - address already in use

         * eaddrnotavail - cannot assign requested address

         * eadv - advertise error

         * eafnosupport - address family not supported by protocol family

         * eagain - resource temporarily unavailable

         * ealign - EALIGN

         * ealready - operation already in progress

         * ebade - bad exchange descriptor

         * ebadf - bad file number

         * ebadfd - file descriptor in bad state

         * ebadmsg - not a data message

         * ebadr - bad request descriptor

         * ebadrpc - RPC structure is bad

         * ebadrqc - bad request code

         * ebadslt - invalid slot

         * ebfont - bad font file format

         * ebusy - file busy

         * echild - no children

         * echrng - channel number out of range

         * ecomm - communication error on send

         * econnaborted - software caused connection abort

         * econnrefused - connection refused

         * econnreset - connection reset by peer

         * edeadlk - resource deadlock avoided

         * edeadlock - resource deadlock avoided

         * edestaddrreq - destination address required

         * edirty - mounting a dirty fs w/o force

         * edom - math argument out of range

         * edotdot - cross mount point

         * edquot - disk quota exceeded

         * eduppkg - duplicate package name

         * eexist - file already exists

         * efault - bad address in system call argument

         * efbig - file too large

         * ehostdown - host is down

         * ehostunreach - host is unreachable

         * eidrm - identifier removed

         * einit - initialization error

         * einprogress - operation now in progress

         * eintr - interrupted system call

         * einval - invalid argument

         * eio - I/O error

         * eisconn - socket is already connected

         * eisdir - illegal operation on a directory

         * eisnam - is a named file

         * el2hlt - level 2 halted

         * el2nsync - level 2 not synchronized

         * el3hlt - level 3 halted

         * el3rst - level 3 reset

         * elbin - ELBIN

         * elibacc - cannot access a needed shared library

         * elibbad - accessing a corrupted shared library

         * elibexec - cannot exec a shared library directly

         * elibmax - attempting to link in more shared libraries than system limit

         * elibscn - .lib section in a.out corrupted

         * elnrng - link number out of range

         * eloop - too many levels of symbolic links

         * emfile - too many open files

         * emlink - too many links

         * emsgsize - message too long

         * emultihop - multihop attempted

         * enametoolong - file name too long

         * enavail - not available

         * enet - ENET

         * enetdown - network is down

         * enetreset - network dropped connection on reset

         * enetunreach - network is unreachable

         * enfile - file table overflow

         * enoano - anode table overflow

         * enobufs - no buffer space available

         * enocsi - no CSI structure available

         * enodata - no data available

         * enodev - no such device

         * enoent - no such file or directory

         * enoexec - exec format error

         * enolck - no locks available

         * enolink - link has be severed

         * enomem - not enough memory

         * enomsg - no message of desired type

         * enonet - machine is not on the network

         * enopkg - package not installed

         * enoprotoopt - bad protocol option

         * enospc - no space left on device

         * enosr - out of stream resources or not a stream device

         * enosym - unresolved symbol name

         * enosys - function not implemented

         * enotblk - block device required

         * enotconn - socket is not connected

         * enotdir - not a directory

         * enotempty - directory not empty

         * enotnam - not a named file

         * enotsock - socket operation on non-socket

         * enotsup - operation not supported

         * enotty - inappropriate device for ioctl

         * enotuniq - name not unique on network

         * enxio - no such device or address

         * eopnotsupp - operation not supported on socket

         * eperm - not owner

         * epfnosupport - protocol family not supported

         * epipe - broken pipe

         * eproclim - too many processes

         * eprocunavail - bad procedure for program

         * eprogmismatch - program version wrong

         * eprogunavail - RPC program not available

         * eproto - protocol error

         * eprotonosupport - protocol not supported

         * eprototype - protocol wrong type for socket

         * erange - math result unrepresentable

         * erefused - EREFUSED

         * eremchg - remote address changed

         * eremdev - remote device

         * eremote - pathname hit remote file system

         * eremoteio - remote i/o error

         * eremoterelease - EREMOTERELEASE

         * erofs - read-only file system

         * erpcmismatch - RPC version is wrong

         * erremote - object is remote

         * eshutdown - cannot send after socket shutdown

         * esocktnosupport - socket type not supported

         * espipe - invalid seek

         * esrch - no such process

         * esrmnt - srmount error

         * estale - stale remote file handle

         * esuccess - Error 0

         * etime - timer expired

         * etimedout - connection timed out

         * etoomanyrefs - too many references

         * etxtbsy - text file or pseudo-device busy

         * euclean - structure needs cleaning

         * eunatch - protocol driver not attached

         * eusers - too many users

         * eversion - version mismatch

         * ewouldblock - operation would block

         * exdev - cross-domain link

         * exfull - message tables full

         * nxdomain - the hostname or domain name could not be found