EasyTCP
view release on metacpan or search on metacpan
my $PORT = undef;
my $SERVER = undef;
prepareserver();
startclient();
startserver();
sub nowindows {
if ($^O =~ /win32/i) {
for (2 .. 7) {
print "ok $_\n";
}
warn("\n\nWARNING: SINCE YOU'RE RUNNING WINDOWS, WE COULD NOT TRULY TEST CLIENT-SERVER FUNCTIONALITY WITHIN 1 PROCESS. ASSUMING TEST SUCCEEDED\n\n");
warn("\n\nTO PROPERLY TEST THIS MODULE, LOOK INTO THE /util/ SUBFOLDER OF THIS DISTRO AND MANYALLY RUN THE server.pl THERE, THEN CONCURRENTLY RUN THE client.pl\n\n");
exit(0);
}
}
sub res {
my $res = shift;
my $desc = shift;
$num++;
if ($res) {
print "ok $num\n";
}
else {
print "not ok $num\n";
warn "Error in test [$desc]: $@\n";
die ("ABORTING TEST\n");
}
}
sub prepareserver {
my $temp;
my @tryports = qw(2345 65496 1025 2042);
foreach (@tryports) {
$PORT = $_;
$SERVER = new Net::EasyTCP(
mode => "server",
port => $PORT,
password => "just another perl hacker",
);
if ($SERVER) {
#
# We succeeded, no need to loop and try a different port
#
last;
}
}
res($SERVER, "Create new server");
$temp = $SERVER->setcallback(
data => \&gotdata,
connect => \&connected,
disconnect => \&disconnected,
);
res($temp, "Set callbacks");
}
sub startserver {
$SERVER->start();
}
sub startclient {
my $temp;
my $pid;
my $starttime;
my $maxelapsed = "15";
$pid = fork();
if ($pid) {
# I'm the parent
return;
}
elsif ($pid == 0) {
# I'm the client
undef $SERVER;
}
else {
die "ERROR: FAILED TO FORK A PROCESS FOR A CLIENT: $!\n";
}
$starttime = time;
while ((time - $starttime) <= $maxelapsed) {
$client = new Net::EasyTCP(
mode => "client",
host => '127.0.0.1',
port => $PORT,
password => "just another perl hacker",
);
if ($client) {
last;
}
}
$client || die "ERROR: CLIENT FAILED TO BE CREATED WITHIN $maxelapsed SECONDS: $@\n";
$temp = $client->receive();
($temp eq "SEND ME COMPLEX") || die "ERROR: CLIENT RECEIVED [$temp] INSTEAD OF [SEND ME COMPLEX]\n";
$temp = $client->send({ "complex" => "data" })
|| die "ERROR: CLIENT FAILED TO SEND HASH REFERENCE: $@\n";
$temp = $client->close()
|| die "ERROR: CLIENT FAILED TO CLOSE CONNECTION: $@\n";
exit(0);
}
sub connected {
my $client = shift;
my $temp;
res($client, "Server received connection");
$temp = $client->send("SEND ME COMPLEX");
( run in 0.757 second using v1.01-cache-2.11-cpan-39bf76dae61 )