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