TOC Index
TCP Socket
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.
Here is an example of a very simplistic "echo" server that listens on localhost, port 3333:
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:
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.
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 and method get), :$encoding specifies the encoding, and :$nl-in determines the character(s) that separate lines.
method get()
Reads a line from the socket and returns it as of type Str. Return Nil on end-of-file (EOF).
method lines()
Returns a lazy list of lines read from the socket.
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.