Provided by: erlang-manpages_18.3-dfsg-1ubuntu3.1_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 =
                     {flags, [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 by the socket.

                recv_cnt:
                  Number of packets received by the socket.

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

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

                recv_oct:
                  Number of bytes received by 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 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) -> 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 | N}:
                  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,   gen_udp:recv/2,3   or
                  gen_sctp:recv/1,2 (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.

                  If  the  value is an integer N in the range -32768 to 32767 (inclusive), the value is added to
                  the socket's count of data messages sent  to  the  controlling  process.  A  socket's  default
                  message  count is 0. If a negative value is specified and its magnitude is equal to or greater
                  than the socket's current message count, the socket's message count is  set  to  0.  Once  the
                  socket's  message count reaches 0, either due to sending received data messages to the process
                  or by being explicitly set, the process is then notified by a special message, specific to the
                  type of socket, that the socket has entered passive mode. Once the socket enters passive mode,
                  to receive more messages setopts/2 must be called again to set the socket back into an  active
                  mode.

                  When using {active, once} or {active, N}, 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}, {active, true} or {active, N} 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. The same is true of {active, N} mode  while  the  message
                  count  is greater than zero. 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, use of the {active, once} mode or {active, N} mode with values
                  of  N  appropriate  for the application 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}:
                  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)) to avoid performance  issues  due  to  unnecessary
                  copying.  In  fact,  the  val(buffer) is automatically set to the above maximum when sndbuf or
                  recbuf values are set. However, since the actual sizes  set  for  sndbuf  and  recbuf  usually
                  becomes  larger,  you  are  encouraged  to  use inet:getopts/2 to analyze the behavior of your
                  operating system.

                {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

                  Note  also  that  the  filesystem  containing  the virtual machine executable (beam.smp in the
                  example above) has to be local, mounted without the nosetuid flag, support extended attributes
                  and that the kernel has to support file capabilities. All this runs out of the box on at least
                  Ubuntu 12.04 LTS, except that SCTP sockets appears to not support network namespaces.

                  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.

                {line_delimiter, Char}(TCP/IP sockets):
                  Sets the line delimiting character for line oriented protocols (line). Default value is $\n.

                {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}:
                  The minimum size of the receive buffer to use for  the  socket.  You  are  encouraged  to  use
                  inet:getopts/2, to retrieve the actual size set by your operating system.

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

                {show_econnreset, Boolean}(TCP/IP sockets):
                  When this option is set to false, as it is by default, an RST that is received  from  the  TCP
                  peer  is treated as a normal close (as though a FIN was sent). A caller to gen_tcp:recv/2 will
                  get {error, closed}. In active mode the controlling process will receive a {tcp_close, Socket}
                  message, indicating that the peer has closed the connection.

                  Setting this option to true will allow you to distinguish between a connection that was closed
                  normally, and one which was aborted (intentionally or unintentionally) by the TCP peer. A call
                  to gen_tcp:recv/2 will return {error, econnreset}. In active  mode,  the  controlling  process
                  will  receive a {tcp_error, Socket, econnreset} message before the usual {tcp_closed, Socket},
                  as is the case for any other socket error. Calls to gen_tcp:send/2 will  also  return  {error,
                  econnreset} when it is detected that a TCP peer has sent an RST.

                  A  connected  socket  returned  from gen_tcp:accept/1 will inherit the show_econnreset setting
                  from the listening socket.

                {sndbuf, Size}:
                  The minimum size of the send buffer  to  use  for  the  socket.  You  are  encouraged  to  use
                  inet:getopts/2, to retrieve the actual size set by your operating system.

                {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

Ericsson AB                                        kernel 4.2                                         inet(3erl)