use strict; use warnings; use threads; use IO::Socket::INET qw( ); use constant SHUT_WR => 1; my $sock = IO::Socket::INET->new( Proto => 'tcp', PeerAddr => $ARGV[0] // 'localhost:echo', ) or die $!; async { print while <$sock>; }; async { print($sock "abc\n"); sleep(3); print($sock "def\n"); shutdown($sock, SHUT_WR); }; $_->join for threads->list;