tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
5
ZUGRIFFE
695
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von Mirar
    Mirar Mirar ist offline Mitglied
    Registriert seit
    Oct 2011
    Beiträge
    20
    Hallo Leute,

    ich habe bei meinem Programm leider ein Problem. Es handelt sich bei dem Programm um eine Fernsteuerung für einen Server im Netzwerk über die Konsole. Das ganze ist in Perl geschrieben. Soweit funktioniert auch alles. Ich kann Befehle beim Client eingeben und der Server führt diese aus und schickt die Ausgabe zurück.

    Ich will das ich wenn ich einen "cd ..." Befehl eingegeben habe, der Server mir alle VERZEICHNISSE im aktuellen Verzeichnis ausgibt. Und genau an der Stelle scheitert es. Das Verzeichnis wird zwar gewechselt aber statt der erwarteten Ausgabe bekomme ich folgendes:

    readdir() attempted on invalid dirhandle DIR at ServerNeu.pl line 63, <GEN1> line 1.
    closedir() attempted on invalid dirhandle DIR at ServerNeu.pl line 68, <GEN1> line 1.


    Hier mal mein Code für den Server:

    Code perl:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    
    #!/usr/bin/perl -w
     
    use strict;
    use IO::Socket;
    use Cwd;
    use File::Basename;
     
    my $port = $ARGV[0];
    unless (defined($port)) {
        print "Geben Sie den Port an...\n"; 
        $port = <STDIN>;
    }
    chomp($port);
     
    my $server = IO::Socket::INET->new(
        LocalPort    => $port,
        Type         => SOCK_STREAM,
        ReuseAddr    => 1,
        Listen       => 10 )
        or die "Couldn't be a tcp server on port $port : $@\n";
     
    print "Server started\n";
     
    my $client = $server->accept( );
     
    my $output;
    my $dir;
    my $directory;
    my $command;
    my $datei;
     
    while(1) {
        $command = <$client>;
        
        if(substr($command, 0, 3) eq "cd ") {   
        
            $dir = substr($command, 3, length($command));
            $dir =~ s/\n+$//;
            
            if(chdir($dir) == 1) {
                $output = "Changed directory";
            } else {
                $output = "Couldn't change directory"; 
            }
            
            $directory = cwd();
            my $path = dirname($dir)."/".basename($dir);
            
            print "\nDirectories in this directory:\n";
            
            opendir(DIR, $path);
            while($datei = readdir(DIR)) { 
                if(-d $datei && $datei ne "." && $datei ne "..") {
                    print $datei."\n" 
                }
            }
            closedir(DIR);
            
            
            
        } elsif($command eq "end\n") {
            close($server);
            print "Shut down Server";
            last;   
        } else {
            $output = qx($command);
        }
        
        print $client $output."\nEOC\n";
    }

    Und hier für die bessere Übersicht die Codestelle die für den Ordnerwechsel und die Ausgabe zuständig ist:

    Code perl:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    $command = <$client>;
        
        if(substr($command, 0, 3) eq "cd ") {   
        
            $dir = substr($command, 3, length($command));
            $dir =~ s/\n+$//;
            
            if(chdir($dir) == 1) {
                $output = "Changed directory";
            } else {
                $output = "Couldn't change directory"; 
            }
            
            $directory = cwd();
            my $path = dirname($dir)."/".basename($dir);
            
            print "\nDirectories in this directory:\n";
            
            opendir(DIR, $path);
            while($datei = readdir(DIR)) { 
                if(-d $datei && $datei ne "." && $datei ne "..") {
                    print $datei."\n" 
                }
            }
            closedir(DIR);
        }

    Ich hoffe ihr könnt mir helfen!

    Danke im Voraus

    Gruß Mirar
     
    Man kann niemanden überholen, wenn man in seine Fußstapfen tritt...

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Es gibt ein extra Forum für Perl Fragen => http://www.tutorials.de/cgi-perl-pyt...y-power-shell/

    Du solltest grundsätzlich prüfen ob opendir erfolgreich war. Offenbar hat das nicht geklappt...

    Code perl:
    1
    2
    3
    4
    5
    
    if (!opendir(DIR, $path)) {
      print "error: could not open $path";
    } else {
      ...
    }
    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Avatar von Mirar
    Mirar Mirar ist offline Mitglied
    Registriert seit
    Oct 2011
    Beiträge
    20
    Guten Morgen,

    ich hab den Code jetzt angepasst und bekomme dann auch gesagt das es nicht geklappt hat. Aber wieso hat es nicht geklappt? Im Internet lese ich immer nur DIR ist kein Filehandle. Was soll das heißen? Es ist doch soweit ich weiß egal was ich da hinschreibe!?

    Gruß Mirar
     
    Man kann niemanden überholen, wenn man in seine Fußstapfen tritt...

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Mirar Beitrag anzeigen
    Guten Morgen,

    ich hab den Code jetzt angepasst und bekomme dann auch gesagt das es nicht geklappt hat. Aber wieso hat es nicht geklappt?
    Was genau wird denn ausgegeben?

    Ist der Pfad auch wirklich ein Verzeichnis?

    Hat der Prozess Leserechte in dem Verzeichnis?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Avatar von Mirar
    Mirar Mirar ist offline Mitglied
    Registriert seit
    Oct 2011
    Beiträge
    20
    error: could not open C:\Dokumente und Einstellungen\User\Desktop\Spielwiese

    Ja das ist definitiv ein Pfad und die Leserechte besitzt er auch.
     
    Man kann niemanden überholen, wenn man in seine Fußstapfen tritt...

  6. #6
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Dann versuch doch mal folgendes:
    Code perl:
    1
    
    opendir(DIR, $path) || die $!;
    Was kommt als Fehlermeldung?

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Mit Perl Verzeichnisinhalt auslesen und in txt Datei schreiben!
    Von psifactory im Forum CGI, Perl, Python, Ruby, Power Shell
    Antworten: 1
    Letzter Beitrag: 31.05.08, 15:32
  2. Verzeichnisinhalt durchsuchen
    Von Eiszwerg im Forum PHP
    Antworten: 4
    Letzter Beitrag: 12.11.06, 20:04
  3. Verzeichnisinhalt auslesen!
    Von Fxice im Forum PHP
    Antworten: 2
    Letzter Beitrag: 09.06.05, 16:07
  4. [c++] Verzeichnisinhalt löschen
    Von biba im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 29.04.03, 08:56
  5. Verzeichnisinhalt SORTIERT ausgeben
    Von b0nzai im Forum PHP
    Antworten: 4
    Letzter Beitrag: 19.03.02, 17:22

Stichworte