inet(3erl)

NAME

   inet - Access to TCP/IP protocols.

DESCRIPTION

   This module provides access to TCP/IP protocols.

   See  also  ERTS  User's  Guide: Inet Configuration for more information
   about how to configure an Erlang runtime system for IP communication.

   The following two Kernel configuration parameters affect  the  behavior
   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.

     * 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 listening socket options are
   inherited. No such application variable is therefore needed for accept.

   Using the Kernel configuration parameters above, one  can  set  default
   options  for all TCP sockets on a node, but use this with care. Options
   such as {delay_send,true} can be specified in this way.  The  following
   is an example of starting an Erlang node with all sockets using delayed
   send:

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

   Notice that default  option  {active,  true}  cannot  be  changed,  for
   internal reasons.

   Addresses as inputs to functions can be either a string or a tuple. For
   example, the IP address 150.236.20.73 can be passed to gethostbyaddr/1,
   either as string "150.236.20.73" or as 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}

   Function parse_address/1 can be useful:

   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 = inet:hostname(),
                h_aliases = [inet:hostname()],
                h_addrtype = inet | inet6,
                h_length = 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

   local_address() = {local, File :: binary() | string()}

          This address family only works on Unix-like systems.

          File  is  normally  a file pathname in a local filesystem. It is
          limited in length by the operating system, traditionally to  108
          bytes.

          A  binary()  is  passed  as  is  to  the operating system, but a
          string() is encoded according to the  system  filename  encoding
          mode.

          Other  addresses  are  possible,  for  example  Linux implements
          "Abstract Addresses". See  the  documentation  for  Unix  Domain
          Sockets on your system, normally unix in manual section 7.

          In  most API functions where you can use this address family the
          port number must be 0.

   socket_address() =
       ip_address() | any | loopback | local_address()

   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()

   returned_non_ip_address() =
       {local, binary()} | {unspec, <<>>} | {undefined, any()}

          Addresses besides  ip_address()  ones  that  are  returned  from
          socket  API  functions.  See in particular local_address().  The
          unspec family corresponds to AF_UNSPEC  and  can  occur  if  the
          other  side has no socket address. The undefined family can only
          occur in the unlikely event of an address  family  that  the  VM
          does not recognize.

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

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

   socket()

          See gen_tcp:type-socket and gen_udp:type-socket.

   address_family() = inet | inet6 | local

EXPORTS

   close(Socket) -> ok

          Types:

             Socket = socket()

          Closes a socket of any type.

   format_error(Reason) -> string()

          Types:

             Reason = posix() | system_limit

          Returns a diagnostic error string. For possible POSIX values and
          corresponding strings, see section POSIX Error Codes.

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

          Returns the state of the Inet configuration database in form  of
          a   list   of   recorded   configuration  parameters.  For  more
          information, see ERTS User's  Guide:  Inet  Configuration.  Only
          parameters with other than default values are returned.

   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  for  the  host  with  the  specified
          address.

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

          Types:

             Hostname = hostname()
             Hostent = hostent()

          Returns  a  hostent  record  for  the  host  with  the specified
          hostname.

          If resolver option inet6 is true, an IPv6 address is looked  up.
          If  that  fails,  the  IPv4 address is looked up and returned on
          IPv6-mapped IPv4 format.

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

          Types:

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

          Returns a hostent record for the host with the  specified  name,
          restricted to the specified address family.

   gethostname() -> {ok, Hostname}

          Types:

             Hostname = string()

          Returns the local hostname. Never fails.

   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  addresses.  Ifname  is  a  Unicode  string. Hwaddr is
          hardware dependent, for example, on Ethernet  interfaces  it  is
          the 6-byte Ethernet address (MAC address (EUI-48 address)).

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

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

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

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

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

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

      Warning:
          On Windows, the data is fetched from different OS API functions,
          so the Netmask and Broadaddr values can be calculated,  just  as
          some Flag values. Report flagrant bugs.

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

          Types:

             Socket = socket()
             Options = [socket_getopt()]
             OptionValues = [socket_setopt()]

          Gets  one  or more options for a socket. For a list of available
          options, see setopts/2.

          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  left
          out  in  the returned list. An error tuple is returned only when
          getting options for the  socket  is  impossible  (that  is,  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.

          RawOptReq consists of 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
          is  to  be used when the underlying getsockopt requires input in
          the argument  field.  In  this  case,  the  binary  size  is  to
          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.

          Example:

          Consider  a  Linux  machine where option TCP_INFO can be used to
          collect TCP statistics for a socket. Assume you  are  interested
          in  field  tcpi_sacked  of struct tcp_info filled in when asking
          for TCP_INFO. To be able to access this information, you need to
          know the following:

            * The numeric value of protocol level IPPROTO_TCP

            * The numeric value of option TCP_INFO

            * The size of struct tcp_info

            * The size and offset of the specific field

          By  inspecting  the  headers or writing a small C program, it is
          found that IPPROTO_TCP is 6, TCP_INFO is 11, the structure  size
          is  92  (bytes),  the offset of tcpi_sacked is 28 bytes, and the
          value is a 32-bit integer. The following code  can  be  used  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 operating
          system, and the Kernel version before executing anything similar
          to this code.

   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:
              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:
              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_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_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 address string.

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

          Types:

             Address = string()
             IPv4Address = ip_address()

          Parses an IPv4 address string containing four fields,  that  is,
          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 specified, 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 addresses.

   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 :: socket()) ->
               {ok,
                {ip_address(), port_number()} |
                returned_non_ip_address()} |
               {error, posix()}

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

          Notice that for SCTP sockets, this function returns only one  of
          the peer addresses of the socket. Function peernames/1,2 returns
          all.

   peernames(Socket :: socket()) ->
                {ok,
                 [{ip_address(), port_number()} |
                  returned_non_ip_address()]} |
                {error, posix()}

          Equivalent to peernames(Socket, 0).

          Notice that the behavior of this function 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 an association Assoc of a socket.

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

          Notice   that  parameter  Assoc  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 behavior for one-to-
          many style sockets, is unfortunately undefined.

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

          Types:

             Socket = socket()
             Port = port_number()

          Returns the local port number for a socket.

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

          Types:

             Socket = socket()
             Options = [socket_setopt()]

          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  is  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 is sent to  the  process.  To  receive  one  more
              message, setopts/2 must be called again with option {active,
              once}.

              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  because  of  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
              behavior automatically when data is received.  This  can  be
              confusing  in  combination  with connection-oriented sockets
              (that  is,  gen_tcp),  as  a  socket  with  {active,  false}
              behavior  reports  closing  differently  than  a socket with
              {active, true} behavior. To simplify programming,  a  socket
              where  the  peer  closed,  and  this  is  detected  while in
              {active,    false}    mode,    still    generates    message
              {tcp_closed,Socket}  when  set  to  {active, once}, {active,
              true}, or {active, N} mode. It is therefore safe  to  assume
              that   message  {tcp_closed,Socket},  possibly  followed  by
              socket port termination (depending on option  exit_on_close)
              eventually  appears  when  a  socket  changes back and forth
              between {active, true} and {active,  false}  mode.  However,
              when peer closing is detected it is all up to the underlying
              TCP/IP stack and protocol.

              Notice that {active, true} mode provides no flow control;  a
              fast  sender  can easily overflow the receiver with incoming
              messages. The same is true for {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  example,  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  cannot  send  faster
              than the receiver can read.

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

            {buffer, Size}:
              The  size  of  the  user-level  software  buffer used by the
              driver. Not to be confused with options sndbuf  and  recbuf,
              which  correspond  to  the  Kernel  socket  buffers.  It  is
              recommended       to       have        val(buffer)        >=
              max(val(sndbuf),val(recbuf))  to  avoid  performance  issues
              because of unnecessary copying. val(buffer) is automatically
              set  to  the  above maximum when values sndbuf or recbuf are
              set. However, as the sizes set for sndbuf and recbuf usually
              become  larger,  you  are  encouraged  to  use  getopts/2 to
              analyze the behavior of your operating system.

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

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

            {dontroute, Boolean}:
              Enables/disables routing bypass for outgoing messages.

            {exit_on_close, Boolean}:
              This option is set to true by default.

              The  only  reason  to  set  it  to  false  is if you want to
              continue sending  data  to  the  socket  after  a  close  is
              detected,  for  example, if the peer uses gen_tcp:shutdown/2
              to shut down the write side.

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

            {high_msgq_watermark, Size}:
              The socket message queue is set to a  busy  state  when  the
              amount  of  data  on  the  message queue reaches this limit.
              Notice that this limit only concerns data that has  not  yet
              reached the ERTS internal socket implementation. Defaults to
              8 kB.

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

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

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

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

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

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

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

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

              The behavior of a socket with this option set to true is 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  (which  has
              separate IPv4 and IPv6 protocol stacks). Most Linux  distros
              still  have  a  system  default  value of false. This policy
              shift among operating systems to  separate  IPv6  from  IPv4
              traffic  has  evolved,  as  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, for example, OpenBSD and Windows. Trying to  set  this
              option  to  false,  when  creating the socket, fails in this
              case.

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

              Therefore,  setting  this  option  to  true  when creating a
              socket never fails, except possibly on a platform where  you
              have customized the kernel to only allow false, which can be
              doable (but awkward) on, for example, OpenBSD.

              If you read back the option value using getopts/2 and get no
              value,  the  option  does  not  exist  in the host operating
              system. The behavior of both an  IPv6  and  an  IPv4  socket
              listening  on  the same port, and for an IPv6 socket getting
              IPv4 traffic is then no longer predictable.

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

            {linger, {true|false, Seconds}}:
              Determines the time-out, in  seconds,  for  flushing  unsent
              data  in  the close/1 socket call. If the first component of
              the value tuple is false, the second is ignored. This  means
              that close/1 returns immediately, not waiting for data to be
              flushed. Otherwise, the second  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 is set in a not busy state when the amount  of
              data  queued  in  the  message queue falls below this limit.
              Notice that this limit only concerns data that has  not  yet
              reached the ERTS internal socket implementation. Defaults to
              4 kB.

              Senders that are suspended because of either a busy  message
              queue  or  a busy socket are resumed when the socket message
              queue and the socket are not busy.

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

              Notice   that   distribution  sockets  disable  the  use  of
              high_msgq_watermark and low_msgq_watermark. Instead they 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 is set in a not
              busy  state when the amount of data queued internally by the
              ERTS socket implementation falls below this limit.  Defaults
              to 4 kB.

              Senders  that  are suspended because of a busy message queue
              or a busy socket are resumed when the socket  message  queue
              and the socket are not busy.

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

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

            {netns, Namespace :: file:filename_all()}:
              Sets a network namespace for the socket. Parameter Namespace
              is   a   filename   defining  the  namespace,  for  example,
              "/var/run/netns/example", typically created  by  command  ip
              netns  add  example.  This option must be used in a function
              call that creates a socket,  that  is,  gen_tcp:connect/3,4,
              gen_tcp:listen/2, gen_udp:open/1,2, or gen_sctp:open/0,1,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 is compiled for such an operating system.

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

              Example:

            setcap cap_sys_admin,cap_sys_ptrace,cap_dac_read_search+epi beam.smp

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

              Namespace is a  filename  and  is  encoded  and  decoded  as
              discussed in module file, with the following exceptions:

              * Emulator flag +fnu is ignored.

              * getopts/2  for  this  option  returns  a  binary  for  the
                filename if the stored filename cannot be decoded. This is
                only  to  occur  if you set the option using a binary that
                cannot 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, option TCP_NODELAY is turned on for the
              socket, which means that also small amounts of data are sent
              immediately.

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

              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
                header  length  can  be  one,  two,  or  four  bytes,  and
                containing  an  unsigned integer in big-endian byte order.
                Each send operation generates the header, and  the  header
                is stripped off on each receive operation.

                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, one message is 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  in  ERTS. A socket in passive mode
                returns {ok, HttpPacket} from gen_tcp:recv while an active
                socket sends messages like {http, Socket, HttpPacket}.

              httph | httph_bin:
                These  two  types  are  often  not  needed,  as the socket
                automatically    switches    from     http/http_bin     to
                httph/httph_bin  internally  after the first line is read.
                However, there can be occasions when they are useful, such
                as parsing trailers from chunked encoding.

            {packet_size, Integer}(TCP/IP sockets):
              Sets  the  maximum allowed length of the packet body. If the
              packet header indicates that the length  of  the  packet  is
              longer  than  the  maximum  allowed  length,  the  packet is
              considered invalid. The same occurs if the packet header  is
              too large 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 because of
              internal buffer limitations.

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

            {priority, Priority}:
              Sets  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 maximum 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. Defaults  to  5.
              If  this  parameter  is  set too high, the system can become
              unresponsive because of UDP packet flooding.

            {recbuf, Size}:
              The minimum size of  the  receive  buffer  to  use  for  the
              socket.  You are encouraged to use getopts/2 to retrieve the
              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 returns {error,timeout}. How
              much of a packet that got sent is  unknown;  the  socket  is
              therefore to be closed whenever a time-out has occurred (see
              send_timeout_close below). Defaults to infinity.

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

              Used together  with  send_timeout  to  specify  whether  the
              socket is to be automatically closed when the send operation
              returns {error,timeout}. The recommended  setting  is  true,
              which  automatically  closes  the  socket. Defaults to false
              because of backward compatibility.

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

              Setting  this  option  to  true  allows  you  to distinguish
              between a connection that was closed normally, and one  that
              was  aborted  (intentionally  or unintentionally) by the TCP
              peer. A call to gen_tcp:recv/2 returns {error,  econnreset}.
              In   active   mode,   the  controlling  process  receives  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   also   returns   {error,
              econnreset}  when it is detected that a TCP peer has sent an
              RST.

              A connected socket returned from  gen_tcp:accept/1  inherits
              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 getopts/2, to  retrieve  the  size
              set by your operating system.

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

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

            {tclass, Integer}:
              Sets IPV6_TCLASS IP level options on platforms where this is
              implemented. The behavior and allowed range  varies  between
              different  systems. The option is ignored on platforms where
              it is not implemented. Use with caution.

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

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

          Example:

          This  example  concerns the use of raw options. Consider a Linux
          system where you want to  set  option  TCP_LINGER2  on  protocol
          level IPPROTO_TCP in the stack. You know that on this particular
          system it defaults to 60 (seconds), but you want to lower it  to
          30 for a particular socket. Option TCP_LINGER2 is not explicitly
          supported  by  inet,  but  you  know  that  the  protocol  level
          translates  to  number 6, the option number to number 8, and the
          value is to be specified as a 32-bit integer. You can  use  this
          code line 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
          specified out of range; it can be a good idea to  check  that  a
          raw  option  is accepted. The following code places the value in
          variable TcpLinger2:

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

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

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

   sockname(Socket :: socket()) ->
               {ok,
                {ip_address(), port_number()} |
                returned_non_ip_address()} |
               {error, posix()}

          Returns the local address and port number for a socket.

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

   socknames(Socket :: socket()) ->
                {ok,
                 [{ip_address(), port_number()} |
                  returned_non_ip_address()]} |
                {error, posix()}

          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 specified association Assoc.

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

          Notice   that  parameter  Assoc  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 must be without any  particular
          association.  How different SCTP implementations interprets this
          varies somewhat.

POSIX ERROR CODES

     * e2big - Too long argument list

     * 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 - Bad RPC structure

     * 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 without 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 - Filename too long

     * enavail - Unavailable

     * 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 been 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 - Wrong program version

     * eprogunavail - RPC program unavailable

     * eproto - Protocol error

     * eprotonosupport - Protocol not supported

     * eprototype - Wrong protocol type for socket

     * erange - Math result unrepresentable

     * erefused - EREFUSED

     * eremchg - Remote address changed

     * eremdev - Remote device

     * eremote - Pathname hit remote filesystem

     * eremoteio - Remote I/O error

     * eremoterelease - EREMOTERELEASE

     * erofs - Read-only filesystem

     * erpcmismatch - Wrong RPC version

     * 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 - Hostname or domain name cannot be found



Opportunity


Personal Opportunity - Free software gives you access to billions of dollars of software at no cost. Use this software for your business, personal use or to develop a profitable skill. Access to source code provides access to a level of capabilities/information that companies protect though copyrights. Open source is a core component of the Internet and it is available to you. Leverage the billions of dollars in resources and capabilities to build a career, establish a business or change the world. The potential is endless for those who understand the opportunity.

Business Opportunity - Goldman Sachs, IBM and countless large corporations are leveraging open source to reduce costs, develop products and increase their bottom lines. Learn what these companies know about open source and how open source can give you the advantage.


Free Software


Free Software provides computer programs and capabilities at no cost but more importantly, it provides the freedom to run, edit, contribute to, and share the software. The importance of free software is a matter of access, not price. Software at no cost is a benefit but ownership rights to the software and source code is far more significant.

Free Office Software - The Libre Office suite provides top desktop productivity tools for free. This includes, a word processor, spreadsheet, presentation engine, drawing and flowcharting, database and math applications. Libre Office is available for Linux or Windows.


Free Books


The Free Books Library is a collection of thousands of the most popular public domain books in an online readable format. The collection includes great classical literature and more recent works where the U.S. copyright has expired. These books are yours to read and use without restrictions.

Source Code - Want to change a program or know how it works? Open Source provides the source code for its programs so that anyone can use, modify or learn how to write those programs themselves. Visit the GNU source code repositories to download the source.


Education


Study at Harvard, Stanford or MIT - Open edX provides free online courses from Harvard, MIT, Columbia, UC Berkeley and other top Universities. Hundreds of courses for almost all major subjects and course levels. Open edx also offers some paid courses and selected certifications.

Linux Manual Pages - A man or manual page is a form of software documentation found on Linux/Unix operating systems. Topics covered include computer programs (including library and system calls), formal standards and conventions, and even abstract concepts.