socket problem
Zdeněk Mazanec
bluehawk na cesnet.cz
Pátek Leden 28 14:59:37 MET 2000
Zdravim pri patku,
uz delsi dobu se potykam s jistym zajimavym problemem. Mam proceduru
(tcp_connect), do ktere nacpu adrese stroje, port ktery se ma otestovat a
ono mi to vrati 1 pokud zije nebo 0 pokud nezije.
Vsechno je to pekny a i to hezky chodi, ale jen do okamziku, kdy se port na
vzdalenem stroji podivne sesype. Pak mi to v takto napsane procedure dokaze
viset i hodiny bez nejakeho kloudneho vysledku.
Experimentalne si tento stav dokazu "temer" vybudit firewallem, kdy reknu
ipchains ... REJECT.
Pak to visi dejme tomu pul hodiny. To jeste jde. Ale jsou i pripady, stroj
spadne "tak nejak napul" - hw adresa je videt, ale jinak nic, a pak mi to
tady visi v podstate neomezene dlouho.
Podle vseho to dela radek
if (!(defined connect(SOCK,$paddr))) {$chyba=0}
Netusite nekdo, jestli se v perlu na nastavit timeout na socketove operace,
nebo jeste lip, neco na zpusob
"venuj se teto cinnosti maximalne n sekund, pak ji nejhut nasilne prerus"?
--------
sub tcp_connect {
my $remote="$_[0]";
my $port="$_[1]";
my $protokol="$_[2]";
my $chyba=1;
if ("$port" eq "ping") { #test na ping
my $p = Net::Ping->new("icmp");
my $ok=0;
$ok=1 unless $p->ping($remote, 2);
if ($ok==1) {return 0} else {return 1}
$p->close();
goto KONEC_TESTU;
}
if ("$protokol" eq "") {$protokol="tcp"}
if ($port=~/\D/) {$port=getservbyname($port,$protokol)}
if (!$port) {return 0; goto TCP_CONNECT_SCRATCH}
$iaddr=inet_aton($remote);
$paddr=sockaddr_in($port,$iaddr);
$proto=getprotobyname($protokol);
socket(SOCK,PF_INET,SOCK_STREAM,$proto);
if (!(defined connect(SOCK,$paddr))) {$chyba=0}
close(SOCK);
KONEC_TESTU:
$chyba=$chyba;
TCP_CONNECT_SCRATCH:
return $chyba;
}
---
Zdenek Mazanec
Další informace o konferenci Perl