#! perl -slw use strict; use threads; use IO::Socket; use Storable qw[ freeze thaw ]; use Data::Dump qw[ pp ]; my %hash; @hash{ 'a'..'z' } = 1 .. 26; my $lsn = new IO::Socket::INET( Listen => 1, LocalPort => '12345' ) or die "Failed to open listening port: $!\n"; async{ while( my $c = $lsn->accept ) { binmode $c; print "Connect from $c"; while( my $cmd = <$c> ) { print "Got '$cmd'"; last if $cmd =~ m[^quit]; printf $c "%s", pack "N/a*", freeze \%hash; } print "Got quit from $c"; close $c; } }->detach; sleep 2; my $s = new IO::Socket::INET( 'localhost:12345' ) or die "Failed to connect to server: $!"; binmode $s; for ( 1 .. 1+rand 100 ) { print $s 'givemeit'; print 'Sent givemeit'; my $len; read( $s, $len, 4 ) or die "Read failed: $!"; $len = unpack 'N', $len; print "read length: $len"; my $hashStr; read( $s, $hashStr, $len ) or die "Read failed: $!"; print "Read hashstr length: ", length $hashStr; my %hash = %{ thaw $hashStr }; pp \%hash; } print $s 'quit'; close $s;