/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
Hvad går galt her ?
Fra : Jesper Frank Nemholt


Dato : 20-02-01 21:27

Hej!

Jeg har lige omskrevet et af mine scripts så det er mere fejltolerent, men
resultatet lever ikke helt op til forventningerne....

Meningen er at det skal forsøge at lave en TCP forbindelse til en anden
maskine (statdb), og hvis dette fejler skal det prøve en anden
(statdb-backup)

Problemet er at det aldrig prøver statdb-backup selvom statdb ikke svarer.


#!/usr/bin/perl -w

use strict;
use Socket;
use IO::Handle;

my ($remote, $remote_backup, $port, $port_backup, $timeout, $verbose,
$iaddr, $iaddr_backup, $paddr, $paddr_backup, $protocol, $socket,
$connection);

# The remote hosts where the StatDB server script is located.
# Default is statdb (primary) and statdb-backup (secondary).
$remote = shift || 'statdb';
$remote_backup = shift || 'statdb';

# The port on the remote hosts where the StatDB server script is listening
on.
# Default is 551234 for statdb & 551235 for statdb-backup.
$port = shift || 551234;
$port_backup = shift || 551235;

# The number of seconds without stdin input before we close any open
connection.
$timeout = 10;

# For debugging purpose.
$verbose = 1;

sub logmsg
{
if ($verbose) { print scalar localtime, " : $0 [$$]: @_\n" };
};

if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') } logmsg "No port."
unless $port;
if ($port_backup =~ /\D/) { $port_backup = getservbyname($port_backup,
'tcp') } logmsg "No port." unless $port_backup;

$iaddr = inet_aton($remote) || logmsg "Host \"$remote\" can not be
resolved";
$iaddr_backup = inet_aton($remote_backup) || logmsg "Host \"$remote_backup\"
can not be resolved";

$paddr = sockaddr_in($port, $iaddr);
$paddr_backup = sockaddr_in($port_backup, $iaddr_backup);

$protocol = getprotobyname('tcp');

$socket = 0;
$connection = 0;

# Ugly endless loop. A hack to make alarm work.
while (1 == 1)
{
# Small sub to close the socket if no input.
local $SIG{ALRM} = sub
{
if ($connection)
{
close (SOCK) || logmsg "$!";
$connection = 0;
};
};

while (<>)
{
SWITCH:
{
alarm $timeout;

if (!$connection)
{
($socket = socket(SOCK, PF_INET,
SOCK_STREAM, $protocol)) || logmsg "$!";
if ($socket)
{
($connection = connect(SOCK,
$paddr)) || logmsg "$!";

if (!$connection)
{
($connection = connect(SOCK,
$paddr_backup)) || logmsg "$!";
};

if ($connection)
{
autoflush SOCK || logmsg
"$!";
};
};
};

# If a TCP connection exist, then send what is
recieved at STDIN to the TCP socket.
if ($connection)
{
print SOCK $_ || logmsg "$!";
};
last SWITCH;
};
};
};
exit;



l8r/Jspr



 
 
Lars Balker Rasmusse~ (21-02-2001)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 21-02-01 09:35

"Jesper Frank Nemholt" <jfn@dassic.com> writes:
> Problemet er at det aldrig prøver statdb-backup selvom statdb ikke svarer.

> # The remote hosts where the StatDB server script is located.
> # Default is statdb (primary) and statdb-backup (secondary).
> $remote = shift || 'statdb';
> $remote_backup = shift || 'statdb';

Skrevet i en sen nattetime?
--
Lars Balker Rasmussen "Woo hoo!?"


Jesper Frank Nemholt (21-02-2001)
Kommentar
Fra : Jesper Frank Nemholt


Dato : 21-02-01 20:14

"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:u7l2k5t9k.fsf@balker.org...
> "Jesper Frank Nemholt" <jfn@dassic.com> writes:
> > Problemet er at det aldrig prøver statdb-backup selvom statdb ikke
svarer.
>
> > # The remote hosts where the StatDB server script is located.
> > # Default is statdb (primary) and statdb-backup (secondary).
> > $remote = shift || 'statdb';
> > $remote_backup = shift || 'statdb';
>
> Skrevet i en sen nattetime?

Ja :), men læg mærke til at portnummeret er forskelligt for hhv. statdb &
statdb-backup, og jeg kører 2 server scripts på samme server (statdb), een
på hver port.

.....så jeg mener stadig at client scriptet burde hive fat i server scriptet
på port 551235 hvis server scriptet på port 551234 stoppes. Det sker bare
ikke.


l8r/Jspr



Lars Balker Rasmusse~ (21-02-2001)
Kommentar
Fra : Lars Balker Rasmusse~


Dato : 21-02-01 20:27

"Jesper Frank Nemholt" <jfn@dassic.com> writes:
> Ja :), men læg mærke til at portnummeret er forskelligt for hhv. statdb &
> statdb-backup, og jeg kører 2 server scripts på samme server (statdb), een
> på hver port.

Ah, så jeg ikke.

> ....så jeg mener stadig at client scriptet burde hive fat i server scriptet
> på port 551235 hvis server scriptet på port 551234 stoppes. Det sker bare
> ikke.

Kan det skyldes at ti sekunder er for lidt til at
$connection = connect(SOCK, $paddrP);
timer ud?

PS: De der };'er går mig på. Der er kun én af dem der skal være der i
dit script.
--
Lars Balker Rasmussen "Special is bad."

Jesper Frank Nemholt (21-02-2001)
Kommentar
Fra : Jesper Frank Nemholt


Dato : 21-02-01 21:07

"Lars Balker Rasmussen" <lars@balker.org> wrote in message
news:0f8zmzvnuq.fsf@humulus.daimi.au.dk...
> "Jesper Frank Nemholt" <jfn@dassic.com> writes:
> > Ja :), men læg mærke til at portnummeret er forskelligt for hhv. statdb
&
> > statdb-backup, og jeg kører 2 server scripts på samme server (statdb),
een
> > på hver port.
>
> Ah, så jeg ikke.
>
> > ....så jeg mener stadig at client scriptet burde hive fat i server
scriptet
> > på port 551235 hvis server scriptet på port 551234 stoppes. Det sker
bare
> > ikke.
>
> Kan det skyldes at ti sekunder er for lidt til at
> $connection = connect(SOCK, $paddrP);
> timer ud?

Det tror jeg ikke, scriptet virker uden problemer med connect & (timeout)
disconnect til den første server. Når jeg kører scriptet får jeg en byge af
"connection refused" i hovedet hvis jeg slår den første server ihjel, så
$connection burde være false og derfor initiere forbindelsen til den anden
port.

Jeg tror jeg lige må lave lidt trace på hvad de forskellige variabler står
til når jeg kører scriptet.
Uden nogle server scripts burde scriptet flip-floppe med forsøg på den ene &
den anden server.

> PS: De der };'er går mig på. Der er kun én af dem der skal være der i
> dit script.

Ja det er en dårlig vane fra andre programmeringssprog.... Pascal vistnok.


l8r/Jspr



Jesper Frank Nemholt (21-02-2001)
Kommentar
Fra : Jesper Frank Nemholt


Dato : 21-02-01 22:35

"Jesper Frank Nemholt" <jfn@dassic.com> wrote in message
news:XdVk6.28047$2w6.401041@twister.sunsite.dk...
> "Lars Balker Rasmussen" <lars@balker.org> wrote in message
> news:0f8zmzvnuq.fsf@humulus.daimi.au.dk...
> > "Jesper Frank Nemholt" <jfn@dassic.com> writes:
> > > Ja :), men læg mærke til at portnummeret er forskelligt for hhv.
statdb
> &
> > > statdb-backup, og jeg kører 2 server scripts på samme server (statdb),
[clip]
> Jeg tror jeg lige må lave lidt trace på hvad de forskellige variabler står
> til når jeg kører scriptet.
> Uden nogle server scripts burde scriptet flip-floppe med forsøg på den ene
&
> den anden server.

Problem løst.... der skulle lige en close(SOCK) & reopen på mellem første og
andet forsøg, idet disse laves lige efter hinanden og close() i min 10
sekunders alarm derfor aldrig får nogen effekt på andet forsøg, kun første.

if (!$connection)
{
($socket = socket(SOCK, PF_INET, SOCK_STREAM, $protocol)) || logmsg
"$!";
if ($socket)
{
($connection = connect(SOCK, $paddr)) || logmsg "$!";
if (!$connection)
{
close (SOCK) || logmsg "$!";
($socket = socket(SOCK, PF_INET, SOCK_STREAM, $protocol)) ||
logmsg "$!";
if ($socket)
{
($connection = connect(SOCK, $paddr_backup)) || logmsg "$!";
}
}
if ($connection)
{
autoflush SOCK || logmsg "$!";
}
else
{
logmsg "Oops, no connection to any server !!!";
}
}
}

# If a TCP connection exist, then send what is recieved at STDIN to the TCP
socket.
if ($connection)
{
print SOCK $_ || logmsg "$!";
}


l8r/Jspr



Søg
Reklame
Statistik
Spørgsmål : 177560
Tips : 31968
Nyheder : 719565
Indlæg : 6408943
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste