Логику не менял - только причезал для удобочитаемости.
#!/usr/bin/perl
use strict;
use Socket;
use IO::Handle;
my ($host, $port, $protocol, $dest_addr);
$host = shift || 'localhost';
print "host=$host ";
$host = inet_aton($host) or die "host problem";
$port = shift || getservbyname('echo', 'tcp');
$protocol = getprotobyname('tcp');
$dest_addr = sockaddr_in($port, $host);
print "port=$port, protocol=$protocol\n";
socket(SOCK, PF_INET, SOCK_STREAM, $protocol) or die "socket:$!";
connect (SOCK, $dest_addr) or die "connect die coz: $!\n";
SOCK->autoflush(1);
print "Connected to ", inet_ntoa($host), "\n";
my ($bytes_in, $bytes_out) = (0, 0);
my ($msg_in, $msg_out);
while ($msg_out = <>)
{
print SOCK $msg_out;
$msg_in = <SOCK>;
print $msg_in;
$bytes_out += length($msg_out);
$bytes_in += length($msg_in);
}
close SOCK;
print "bytes_sent=$bytes_out, bytes_recived = $bytes_in\n";
Проверяем...
$ ./t3.pl
host=localhost port=7, protocol=6
connect die coz: Connection refused
И это нормально: сервис "echo" на нашем хосте отсутствует.
$ ./t3.pl pop.mail.ru 110
host=pop.mail.ru port=110, protocol=6
Connected to 194.67.23.102
USER xxxx@mail.ru
+OK
PASS xxxxxxxxxxxx
+OK Password required for user xxxx@mail.ru
LIST
+OK xxxx@mail.ru maildrop has 84 messages (5547008 octets)
+OK 84 messages (5547008 octets)