# $Id: ae0.pl,v 1.2 2009-08-06 14:00:36 root Exp $
# An echo client-server benchmark.

use warnings;
use strict;

use Time::HiRes qw(time);
use AnyEvent;
use AnyEvent::Impl::Perl;
use AnyEvent::Socket;
use IO::Socket::INET;

my $CYCLES = 500;
my $port   = 11212;

my $serv_sock = IO::Socket::INET-> new(
        Listen    => 5,
        LocalPort => $port,
        Proto     => 'tcp',
        ReuseAddr => 1,
);

my $serv_w = AE::io $serv_sock, 0, sub {
   accept my $fh, $serv_sock
      or return;
   sysread $serv_sock, my $buf, 512;
   syswrite $serv_sock, $buf;
};

my $t = time;
my $connections;

sub _make_connection {
   if ($connections++ < $CYCLES) {
      tcp_connect "127.0.0.1", $port, sub {
         my ($fh) = @_
            or die "tcp_connect: $!";
         syswrite $fh, "can write $connections\n";
         my $w; $w = AE::io $fh, 0, sub {
            sysread $fh, my $buf, 512;
            undef $fh;
            undef $w;
            &_make_connection;
         };
      };
   } else {
      $t = time - $t;
      printf "%.3f sec\n", $t;
      exit;
   }
};

_make_connection;
AnyEvent->condvar->recv;