Thread IO::Socket Problem: Socket braucht zu lange (7 answers)
Opened by coax at 2005-05-25 18:48

coax
 2005-05-25 18:48
#37698 #37698
User since
2003-08-11
457 Artikel
BenutzerIn
[default_avatar]
Erst einmal use warnings; und use strict;, damit wirst du eine Menge Probleme loesen und weiteren Problemen vorbeugen.
Code: (dl )
1
2
3
4
my @OPorts;
my $a = -1;
# [ ... ]
@OPorts[$a] = $i; $a++;

Das tut so nicht funktionieren, weil du spaeter erst der Arrayvariable mit dem Index -1 ($OPorts[-1]) etwas zuweist und erst danach $a inkrementierst - das ist illegal ;).

Code: (dl )
@OPorts[$a] = $i; $a++;

@OPorts[$a] ist ein Array-Slice, du willst sicher $OPorts[$a] (mit use warnings haettest du auch eine entsprechende Warnung bekommen Scalar value @OPorts[$a] better written as $OPorts[$a]).

Statt globaler Variablen ($startport, $stopport, $host) kannst du mit Parameteruebergabe arbeiten
Code: (dl )
&scanstart($host, $startport, $stopport);

Code: (dl )
1
2
3
sub scanstart {
   my($host, $startport, $stopport) = @_;
# [ ... ]

Auch die Pruefung
Code: (dl )
1
2
3
4
5
6
if (&socket($host, $i) eq "True") {
   print "\t* Port $i; Open!\n";
   $OPorts[$a] = $i;
   $a++;
}
else { print "\t* Port $i; Closed!\n" }

kannst du dir etwas vereinfach;
Der IO::Socket-Konstruktur liefer naemlich undef zurueck falls ein Fehler aufgetreten ist (Fehlermeldung steckt in $@),
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
sub socket {
  my($host, $cport) = @_;

  my $socket = IO::Socket::INET->new (
   PeerAddr => $host,
   PeerPort => $cport,
   Proto => "tcp",
   Timeout => 1,
   Type => SOCK_STREAM
  );
  return $socket;
}
Wenn du dein True, False beibehalten willst
Code: (dl )
return $socket ? "True" : "False";

Code: (dl )
1
2
3
4
5
if ( &socket($host, $i) ) {
   print "\t* Port $i; Open!\n";
   $OPorts[$a] = $i;
   $a++;
   } else { print "\t* Port $i; Closed!\n" }

Das hier fuehrt zwar zu den erwuenschte Ergebnis
Code: (dl )
) || { $bool = "False" };

ist aber ein ueberfluessiges Konstrukt, die geschweiften Klammern stellen naemlich ein anonymer Hash dar und kein Anweisungsblock ($bool = "False" wird trotzdem ausgewertet). So waer's richtig...
Code: (dl )
1
2
3
4
5
6
) || ( $bool = "False" )
# oder so etwas...
my $socket = IO::Socket::INET->new (
# [ ... ]
);
my $bool = $socket ? "True" : "False";

edit:
Code: (dl )
foreach $pp (@OPorts) { print "$pp, " }
kuerzer
Code: (dl )
print join ',' => @OPorts
jetzt ist da auch kein stoerendes Komma mehr hinter'm letzten Wert.

Die Variable $a kannst du dir sparen, wobei der Bezeichner auch noch schlecht gewaehlt ist
Code: (dl )
1
2
3
4
5
6
7
8
foreach my $port ( $startport .. $stopport ) {
   if # [ ... ] port offen
       # [ ... ]
       push @OPorts, $port;
   else { # port geschlossen
       # [ ... ]
   }
}


Grusz Christian.\n\n

<!--EDIT|coax|1117037897-->
,,Das perlt aber heute wieder...'' -- Dittsche

View full thread IO::Socket Problem: Socket braucht zu lange