use strict; use warnings; package Server; use IO::Socket::SSL; use Storable qw(nfreeze); unless (-d "certs") {    if (-d "../certs") {        chdir "..";    } else {        die "Please run this example from the IO::Socket::SSL distribution directory!\n";    } } sub run {   my $socket = IO::Socket::SSL->new(      Listen => 5,      LocalAddr => 'localhost',      LocalPort => 9000,      Proto     => 'tcp',      Reuse     => 1,      SSL_verify_mode => 0x01,      SSL_passwd_cb => sub {return "bluebell"},   ) or die "server: can't open socket over port 9000";   warn "server initialized\n";   while (my $client = $socket->accept()) {      chomp (my $request = <$client>);      next unless $request;      warn "client request: $request\n";      my %hash = (a=>1,b=>2,c=>'3');      my $packet = nfreeze(\%hash);      $packet = pack("N/a*", $packet);      print $client $packet;      close($client);      close($socket);   } } package Client; use IO::Socket::SSL; use Storable qw(thaw); use Data::Dumper; use Safe; sub run {   my $socket = IO::Socket::SSL->new(      PeerAddr => 'localhost',      PeerPort => '9000',      Proto    => 'tcp',      SSL_use_cert => 1,      SSL_verify_mode => 0x01,      SSL_passwd_cb => sub { return "opossum" }   ) or die "client: can't connect to 127.0.0.1:9000";   warn "client connected to server\n";   print $socket "hash\n";  my $safe = new Safe;   $safe->permit(qw(:default require));   {      no warnings 'once';      $Storable::Deparse = 1;      $Storable::Eval = sub { $safe->reval($_[0]) };   }   die if 4 != read($socket, my $buf, 4);   my $len = unpack("N", $buf);   die if $len != read($socket, $buf, $len);   my $data = thaw($buf);   close($socket);   warn Dumper($data); } 1; if (my $pid = fork) {   run Server;   waitpid($pid,0); } else {   sleep 1;   run Client; }