MaLu: Problem mit Socket

Alle Alle,

ich habe mir heute ein Perl Script programmiert, dass mir überprüft, ob ein bestimmter Webserver an ist. Wenn ich das Script habe aufrufe, kommt Error 500 Internal Server Error.

Mein Script lautet:

#!/usr/bin/perl

$tan = 'http://www.domain.de'
print "Server 1: ";
$client = new IO::Socket::INET(PeerAddr => "$tan",PeerPort => "80",Timeout => 5,Type => SOCK_STREAM,Proto => 'tcp');
if($client) {print "<span class=green>&nbsp;ERREICHBAR&nbsp;</span>.\n";}
else {print "<span class=red>&nbsp;NICHT ERREICHBAR&nbsp;</span>.\n";}
close($client);

Bitte helft mir.

  1. Sorry ich meinte "Hallo Alle," statt "Alle Alle,"

  2. Hallo,
    Hast Du das Skript mal einfach so in einer Shell laufen lassen?
    Was spricht es da, funktionierts da?

    Falls das Skript in einer Shell gestartet funktioniert und das ausgibt, was du möchtest, könnte es am fehlenden Content-Type liegen, dass es im Webserver nicht geht:

    Manche Webserver vertragen es nicht, wenn ein Perl-Skript bei der ausgabe keinen Header verwendet.

    Abhilfe schaffst Du durch ein

    print "Content-Type: text/html\n\n";
    zu Beginn deines Skriptes.

    Hoffe, das hilft Dir weiter.

    Ciao,
    Jörg

    1. Ich kenn mich micht Perl nicht so gut aus, was ist eine Shell?

      1. Hallo,

        Ich kenn mich micht Perl nicht so gut aus, was ist eine Shell?

        Das hat mit Perl an sich nichts zu tun. Es ist die Kurzbezeichnung für alle kommandozeilen-orientierten Benutzeroberflächen wie z.B. die Windows Eingabeaufforderung oder eben eine der vielen Unix-Shells wie bash, sh, ksh csh usw.

        Gemeint war eigentlich: Was wird ausgegeben, wenn Du das Perl-Script nicht über den Webserver sondern von direkt über eine  anderen Benutzeroberfläche startest. (das kann auch z.B. über einen geeigneten Texteditor erfolgen).

        Grüße
          Klaus

        1. Achso,

          da kommt das gleiche raus. Error 500 Internal Server Error.

          1. Achso,

            da kommt das gleiche raus. Error 500 Internal Server Error.

            In der Konsole? Das kann nicht sein.

            Struppi.

            1. In der Konsole? Das kann nicht sein.

              Struppi.

              Wenn ich in der Konsole die Datei öffne, öffnet sich der Editor mit dem Script.

              Gruß
              MaLu

              1. In der Konsole? Das kann nicht sein.

                Struppi.

                Wenn ich in der Konsole die Datei öffne, öffnet sich der Editor mit dem Script.

                Mit perl skript.pl?

                Aber mal abgesehen, du hast doch schon gesagt bekommen was an dem Skript falsch ist. Trotz http Header läuft es immer noch nicht?

                Struppi.

                1. Nein, es läuft auch mit http Header nicht. Probiere du es doch mal selbst aus. Kopiere den Quelltext und lass es bei dir laufen.

                  Quelltext:

                  #!/usr/bin/perl

                  print "Content-Type: text/html\n\n";
                  $tan = 'http://www.domain.de'
                  print "Server 1: ";
                  $client = new IO::Socket::INET(PeerAddr => "$tan",PeerPort => "80",Timeout => 5,Type => SOCK_STREAM,Proto => 'tcp');
                  if($client) {print "<span class=green>&nbsp;ERREICHBAR&nbsp;</span>.\n";}
                  else {print "<span class=red>&nbsp;NICHT ERREICHBAR&nbsp;</span>.\n";}
                  close($client);

                  1. Hallo,

                    Nein, es läuft auch mit http Header nicht. Probiere du es doch mal selbst aus. Kopiere den Quelltext und lass es bei dir laufen.

                    Quelltext:

                    #!/usr/bin/perl

                    print "Content-Type: text/html\n\n";
                    $tan = 'http://www.domain.de'
                    print "Server 1: ";
                    $client = new IO::Socket::INET(PeerAddr => "$tan",PeerPort => "80",Timeout => 5,Type => SOCK_STREAM,Proto => 'tcp');
                    if($client) {print "<span class=green>&nbsp;ERREICHBAR&nbsp;</span>.\n";}
                    else {print "<span class=red>&nbsp;NICHT ERREICHBAR&nbsp;</span>.\n";}
                    close($client);

                    Abgesehen von einem Syntax-Fehler bei '$tan =...' dürfte auch das fehlende Einbinden des IO::Socket-Moduls ein Problem darstellen.
                    Ausserdem denke ich nicht, dass der Server 'http://www.domain.de' erreichbar sein wird. Aber das sind dann ja nur Kleinigkeiten.

                    Grüße
                      Klaus

                    1. Hallo Klaus,

                      wie binde ich das IO::Socket-Modul den ein?

                      Bitte bearbeiten sie mir den Quelltext und fügen den fertig hier einfügen.

                      Gruß
                      MaLu

                      1. Hallo,

                        wie binde ich das IO::Socket-Modul den ein?

                        Dort kannst Du das nachlesen.

                        Bitte bearbeiten sie mir den Quelltext und fügen den fertig hier einfügen.

                        Da kann ich auf gut österreichisch nur sagen:
                        Oba fui fix sicha net! Söba mochn is aungsogt.

                        Grüße
                          Klaus

                        1. Habe jetzt IO::Socket eingebunden, geht auch so weit. Aber er zeigt immer "NICHT ERREICHBAR" an. Warum weis ich nicht.

                          Die Variable $tan ist nur als test.

                          Quelltext:

                          #!/usr/bin/perl

                          use IO::Socket;

                          print "Content-Type: text/html\n\n";
                          $tan = 'http://forum.de.selfhtml.org';
                          print "Server 1: ";
                          $client = new IO::Socket::INET(PeerAddr => "$tan",PeerPort => "80",Timeout => 1,Type => SOCK_STREAM,Proto => 'tcp');
                          if ($client) {print "<span class=green>&nbsp;ERREICHBAR&nbsp;</span>.\n";}
                          else {print "<span class=red>&nbsp;NICHT ERREICHBAR&nbsp;</span>.\n";}
                          close($client);

                          1. Hallo,

                            Habe jetzt IO::Socket eingebunden, geht auch so weit. Aber er zeigt immer "NICHT ERREICHBAR" an. Warum weis ich nicht.

                            Weil IO::Socket::INET für den Parameter 'PeerAddr' die Adresse eines Rechners erwartet und keine Kombination mit einem  wie auch immer angegebenen Protokoll.

                            Oder anders ausgedrückt: Es gibt keinen Rechner der 'http://forum.de.selfhtml.org' heisst.

                            Grüße
                              Klaus

                            1. Hallo,

                              Oder anders ausgedrückt: Es gibt keinen Rechner der 'http://forum.de.selfhtml.org' heisst.

                              Wieso nicht? Wie heißt er denn?

                              1. Moin,

                                Wieso nicht? Wie heißt er denn?

                                forum.de.selfhtml.org. Ohne http://.

                                "http://" ist das Protokoll, "forum.de.selfhtml.org" der Rechnername.

                                1. Vielen Dank alle.

                                  Mein Problem ist jetzt gelöst.

                      2. Hallo MaLu

                        wie binde ich das IO::Socket-Modul den ein?

                        bitte lies im Perl-Kapitel von SELFHTML den Abschnitt Einführung in das Arbeiten mit Modulen.

                        Freundliche Grüße

                        Vinzenz

                    2. Hallo,

                      Abgesehen von einem Syntax-Fehler bei '$tan =...' dürfte auch das fehlende Einbinden des IO::Socket-Moduls ein Problem darstellen.

                      Ach, da fehlte ja noch der Hinweis darauf, dass bei einem 'Internal server Error' sich deine ganze Aufmerksamkeit auf die Logfiles des Servers richten sollte, denn dort sind auch die Gründe zu finden, warum der Server den Request nicht erfolgreich durchführen konnte.

                      Und eine Testumgebung, in der man das Perl-Script auch ohne Webserver ausführen kann ist sicherlich nie verkehrt. Nur gut, dass es Perl für jedes halbwegs aktuelles Betriebssystem verfügbar ist.

                      Grüße
                        Klaus

  3. Mein Script lautet:

    #!/usr/bin/perl

    du solltest auf jeden Fall immer die Warnungen einschalten und das Skript mit use strict starten, das erleichtert die Fehlersuche.

    Näheres hier: http://de.selfhtml.org/perl/intro.htm

    Bitte helft mir.

    Deon Problem liegt nicht an socket, sondern daran dass du nicht weißt wie man ein CGI Skript schreibt. Die erste Zeile der Ausgabe muss ein Content-Type sein. wie dir Jörg schon schrieb.

    In der Shell oder Konsole (unter Windows MS-DOS Konsole) kannst du die Perl Skript aufrufen und siehst ob dein skript überhaupt startet.

    Struppi.

  4. Hell-O!

    ich habe mir heute ein Perl Script programmiert, dass mir überprüft, ob ein bestimmter Webserver an ist.

    Eventuell wäre im HTTP-Kontext LWP::Simple die bessere Wahl. Eine recht gute Anleitung gibt's bei Thomas Fahle.

    Siechfred