nach ports scannen



  • Hallo!

    Ich weiss nicht mehr weiter...
    Ich habe folgenden Code:

    #include <sys/socket.h>
    #include <iostream>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <errno.h>
    
    using namespace std;
    
    int main(int argc, char **argv)
    {
      int socket_nummer;
      int laenge;
      sockaddr_in adressinfo;
      int ergebnis;
      uint16_t portnummer;
    
      for(portnummer = 50; portnummer<101; portnummer++)
      {
    
      if((socket_nummer = socket(AF_INET, SOCK_STREAM, 0)) == -1)
      {
        int errsv = errno;
        cerr << "socket konnte nicht erstellt werden." << endl;
      }else
      {
        cout << "socket erstellt..." << endl;
      }
    
      adressinfo.sin_family = AF_INET;
      adressinfo.sin_addr.s_addr = inet_addr("127.0.0.1");
      adressinfo.sin_port = htons(portnummer);
    
      laenge = sizeof(adressinfo);
    
      cout << "a" << endl;
      ergebnis = connect(socket_nummer, (struct sockaddr *)&adressinfo, laenge);
      cout << "b" << endl;
    
      if(ergebnis == -1)
      {
        int errsv = errno;
        cout << endl << "Verbindungsaufbau gescheitert "; cout << portnummer << endl;
      }else
      {
        cout << endl << "Verbindungsaufbau erfolgreich! "; cout << portnummer << endl;
      }
    
      close(socket_nummer);
      cout << endl << endl;
    
      }
    
      return 0;
    }
    

    Ausgabe davon ist:

    ./socket_lernen 
    socket erstellt...
    a
    

    also "a" wird noch ausgegeben. Danach kommt die Funktion connect().
    Wenn ich aber in Zeile 31 den Port als Zahl eingebe dann läuft mein Proramm.
    Als Variable "portnummer" bricht das Programm, wie oben beschrieben, ab.

    Also zB anstatt...

    adressinfo.sin_port = htons(portnummer);
    

    geht nicht...
    ...folgendes geht...

    adressinfo.sin_port = htons(80);
    

    Kann mir einer weiterhelfen?


  • Mod

    Was macht denn connect, wenn es nicht sofort eine Verbindung herstellen kann?

    Oder um dich mal von deinem Holzweg runter zu lotsen: Das Programm, welches erst nicht funktioniert und dann funktioniert, wenn du die 80 fest eingibst: Was passiert, wenn du stattdessen 50 fest eingibst? Oder was passiert, wenn du deine Schleife bei 80 anfangen lässt?

    P.S.: Bei 127.0.0.1 sollte jedoch sofort feststehen, ob die Verbindung klappt oder nicht. Passiert das beschriebene Verhalten bei dir wirklich bei 127.0.0.1?



  • Tatsache!

    Wenn ich 127.0.0.1 eingebe, dann funktioniert es.
    Wenn ich aber eine IP eingebe von einem Server aus dem Internet, dann bleibt das Programm hängen.
    Womit hängt das zusammen?



  • SeppJ schrieb:

    Was macht denn connect, wenn es nicht sofort eine Verbindung herstellen kann?



  • Swordfish schrieb:

    SeppJ schrieb:

    Was macht denn connect, wenn es nicht sofort eine Verbindung herstellen kann?

    Sagen wir mal so: Weiß ich nicht!



  • eigentlich gibt die Funktion doch dann einen Wert zurück, oder nicht?

    RETURN VALUE
    If the connection or binding succeeds, zero is returned. On error, -1 is returned, and errno is set appropriately.


  • Mod

    eigentlich gibt die Funktion doch dann einen Wert zurück, oder nicht?

    Wann? Wie stellt connect denn wohl fest, ob eine Verbindung funktioniert oder nicht? Es gibt schließlich kein Besetztzeichen*...

    *: Ja, genau genommen gibt es so etwas schon. Aber was, wenn keine Antwort kommt?



  • SeppJ schrieb:

    eigentlich gibt die Funktion doch dann einen Wert zurück, oder nicht?

    Wann? Wie stellt connect denn wohl fest, ob eine Verbindung funktioniert oder nicht? Es gibt schließlich kein Besetztzeichen*...

    *: Ja, genau genommen gibt es so etwas schon. Aber was, wenn keine Antwort kommt?

    hmm... dann wartet connect wahrscheinlich solange bis eine kommt?
    Irgendwann vielleicht einen timeout?



  • kirschsahne schrieb:

    SeppJ schrieb:

    eigentlich gibt die Funktion doch dann einen Wert zurück, oder nicht?

    Wann? Wie stellt connect denn wohl fest, ob eine Verbindung funktioniert oder nicht? Es gibt schließlich kein Besetztzeichen*...

    *: Ja, genau genommen gibt es so etwas schon. Aber was, wenn keine Antwort kommt?

    hmm... dann wartet connect wahrscheinlich solange bis eine kommt?
    Irgendwann vielleicht einen timeout?

    Oh Gott... ein timeout kommt!


  • Mod

    kirschsahne schrieb:

    Oh Gott... ein timeout kommt!

    Genau. Und wenn du so lange wartest, wie auf deinem System ein timeout dauert, dann funktioniert auch sicherlich dein Programm wie gewünscht. Was sicher nicht das ist, was du willst, da es ewig dauern würde. Ich weiß gerade leider nicht, ob du das Timeout temporär runter setzen kannst, musst du mal selber gucken. Eine andere Idee wäre das parallele Abfragen vieler Ports.



  • Ok, vielen Dank erstmal! Ihr habt mir weitergeholfen. 🙂

    Ich werde mal gucken wie man das umsetzen kann.


Anmelden zum Antworten