# -*- perl -*- # # $Id: server,v 1.2 1999/08/12 14:28:59 joe Exp $ # # This example implements a very simple server, let's call it # multiplier. When a client connects, it waits for decimal numbers # as input. These numbers are written back, multiplied by 2. # require 5.004; use strict; use lib qw(blib/arch blib/lib); $| = 1; use Net::Daemon::Test (); use IO::Socket (); package Multiplier; use vars qw($VERSION @ISA); $VERSION = '0.01'; @ISA = qw(Net::Daemon::Test); sub Version ($) { return "Multiplier - A simple network calculator; 1998, Jochen Wiedmann"; } sub GetLine { my $sock = shift; $sock->getline(); } sub Print { my $sock = shift; $sock->print(@_) && $sock->flush(); } sub Loop { my $self = shift; if ($self->{'loop-timeout'}) { my $count = $self->{'loop-count'} || 0; if (($self->{'loop-count'} = ++$count) == 10) { $self->Done(); open(COUNT, ">ndtest.cnt"); print COUNT "10\n"; close(COUNT); } } } sub Run ($) { my $self = shift; sleep 1 if $self->{'mode'} eq "fork"; # Waiting one second sometimes helps the parent to catch # children nicely, if they die immediately my($line, $sock); $sock = $self->{'socket'}; eval { while (1) { if (!defined($line = GetLine($sock))) { if ($sock->error()) { die "Client connection error " . $sock->error() . " ($!)"; } last; } my $num; { my $lock = lock($Net::Daemon::RegExpLock) if ($self->{'mode'} eq 'threads'); if ($line =~ /(\d+)/) { $num = $1; } } if (defined($num)) { if (!Print($sock, $num*2, "\n")) { die "Client connection error " . $sock->error() . " ($!) while writing."; } } else { die "Server cannot parse input: $line"; } } }; if ($@) { print STDERR "$@\n"; $self->Error($@); } $sock->close(); } package main; my $server = Multiplier->new({ 'pidfile' => 'none' }, \@ARGV); eval { $server->Bind() }; print STDERR "Unexpected return from Bind().\n" if (!$server->Done()); print STDERR "Server died: $@\n" if $@;