Networking and Sockets

Higher-level: Net::SSH2 / Net::OpenSSH (SSH automation), Net::FTP (core), Net::SMTP / Email::Sender / Email::Stuffer (email), Net::DNS, Net::Ping, NetAddr::IP (IP math), Net::SNMP, Mojo::IOLoop (async servers).

use v5.36;
use IO::Socket::IP;                      # core, supports IPv4 and IPv6

# TCP server
my $server = IO::Socket::IP->new(
    LocalHost => '0.0.0.0', LocalPort => 9000,
    Listen => 10, ReuseAddr => 1,
) or die "Can't listen: $@";
while (my $client = $server->accept) {
    $client->autoflush(1);
    my $peer = $client->peerhost;
    while (my $line = <$client>) {
        last if $line =~ /^quit/i;
        print {$client} "echo: $line";
    }
    close $client;
}

# TCP client
my $sock = IO::Socket::IP->new(PeerHost => 'localhost', PeerPort => 9000) or die $@;
print {$sock} "hello\n";
print scalar <$sock>;

# Multiplexing many clients
use IO::Select;
my $sel = IO::Select->new($server);
while (my @ready = $sel->can_read) {
    for my $fh (@ready) {
        if ($fh == $server) { $sel->add($server->accept) }
        else { my $data = <$fh>; if (defined $data) { print {$fh} $data } else { $sel->remove($fh); close $fh } }
    }
}

# UDP
my $udp = IO::Socket::IP->new(Proto => 'udp', PeerHost => '127.0.0.1', PeerPort => 5514);
$udp->send("log message");

# TLS
use IO::Socket::SSL;
my $tls = IO::Socket::SSL->new(PeerHost => 'example.com', PeerPort => 443, SSL_verify_mode => SSL_VE
…