txt: ## inet.md
  class IO::Socket::INET
  
  TCP Socket
  
  ```raku
  class IO::Socket::INET does IO::Socket {}
  
  ```
  
  `IO::Socket::INET` provides TCP sockets, both the server and the client side.
  
  For UDP support, please see [`IO::Socket::Async`](/type/IO/Socket/Async).
  
  Here is an example of a very simplistic "echo" server that listens on `localhost`, port `3333`:
  
  ```raku
  my $listen = IO::Socket::INET.new( :listen,
                                     :localhost<localhost>,
                                     :localport(3333) );
  loop {
      my $conn = $listen.accept;
      try {
          while my $buf = $conn.recv(:bin) {
              $conn.write: $buf;
          }
      }
      $conn.close;
  
      CATCH {
            default { .payload.say;      }
      }
  
  }
  
  ```
  
  And a client that connects to it, and prints out what the server answers:
  
  ```raku
  my $conn = IO::Socket::INET.new( :host<localhost>,
                                   :port(3333) );
  $conn.print: 'Hello, Raku';
  say $conn.recv;
  $conn.close;
  
  ```
  
  Please bear in mind that this is a synchronous connection; an attempt by any of the nodes to write without the other reading will produce the error `Could not receive data from socket: Connection reset by peer`.
  
  # [Methods](#class_IO::Socket::INET "go to top of document")[§](#Methods "direct link")
  
  ## [method new](#class_IO::Socket::INET "go to top of document")[§](#method_new "direct link")
  
  ```raku
  multi method new(
          :$host,
          :$port,
          :$family = PF_INET,
          :$encoding = 'utf-8',
          :$nl-in = "\r\n",
      --> IO::Socket::INET:D)
  multi method new(
          :$localhost,
          :$localport,
          :$family = PF_INET,
          :$listen,
          :$encoding = 'utf-8',
          :$nl-in = "\r\n",
      --> IO::Socket::INET:D)
  
  ```
  
  Creates a new socket.
  
  If `:$listen` is True, creates a new socket that listen on `:$localhost` (which can be an IP address or a domain name) on port `:$localport`; in other words the `:$listen` flag determines the *server mode* of the socket. Otherwise (i.e., `:$listen` is `False`), the new socket opens immediately a connection to `:$host` on port `:$port`.
  
  `:$family` defaults to `PF_INET` constant for IPv4, and can be set to `PF_INET6` constant for IPv6.
  
  For text operations (such as [method lines](#method_lines) and [method get](#method_get)), `:$encoding` specifies the encoding, and `:$nl-in` determines the character(s) that separate lines.
  
  # [Methods](#class_IO::Socket::INET "go to top of document")[§](#Methods_0 "direct link")
  
  ## [method get](#class_IO::Socket::INET "go to top of document")[§](#method_get "direct link")
  
  ```raku
  method get()
  ```
  
  Reads a line from the socket and returns it as of type [`Str`](/type/Str). Return [`Nil`](/type/Nil) on end-of-file (EOF).
  
  ## [method lines](#class_IO::Socket::INET "go to top of document")[§](#method_lines "direct link")
  
  ```raku
  method lines()
  ```
  
  Returns a lazy list of lines read from the socket.
  
  ## [method accept](#class_IO::Socket::INET "go to top of document")[§](#method_accept "direct link")
  
  ```raku
  method accept()
  ```
  
  In listen/server mode, waits for a new incoming connection. Once a new connection is established, an `IO::Socket::INET` instance (or a subclass instance) for consuming the connection is returned.
  