#!/usr/bin/perl -w use strict; use IO::Socket; my ($msg, $resp, $from_addr, $msg_title); my ($verbose, $debug); $| = 1; $verbose = 0; $debug = 0; sub snd { my $sock = shift; my $msg = shift; my $len = length($msg); if ($debug) {print $sock->fileno . ": $len : $msg"} $msg = pack('N', $len) . $msg; syswrite($sock, $msg, length($msg)); } sub rcv { my $sock = shift; my $buf; my ($bytes_read, $total_read, $bytes_to_read); $bytes_read = sysread($sock, $buf, 4); if ($! || ($bytes_read != 4)) { return undef; } else { $bytes_to_read = unpack('N',$buf); $total_read = 0; my $buf2 = $buf = undef; while ($total_read < $bytes_to_read) { $bytes_read = sysread($sock, $buf, $bytes_to_read - $total_read); $buf2 .= $buf; $total_read += $bytes_read; } $buf = $buf2; } return $buf; } my $server = IO::Socket::INET->new( Proto => 'tcp', PeerAddr => 'localhost', PeerPort => 6900 ); $server->autoflush(); $_ = rcv($server); my ($conn_id) = /HELO (.*)/; #print "$conn_id: Connected to server\n"; my ($cmd,$buf); if (defined($cmd = shift)) { snd($server,$cmd); $buf = rcv($server); if (defined($buf)) { print "$buf\n"; snd($server,"quit"); } } else { print "$_\n"; $buf = ; snd($server,$buf); while(defined($buf = rcv($server))) { print "$buf\n"; if ($buf ne 'Bye!') { $buf = ; snd($server, $buf); } } }