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
…