Local Network Scanner



  • Hi,
    ich wollte mal ein C++ Programm schreiben, welches das lokale Netzwerk nach Hosts absucht. Wenn ich es ausführe passiert nichts. Dies habe ich mit diesem Code probiert

    #include <iostream>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h> 
    #include <arpa/inet.h> 
    #include <unistd.h>
    #include <string>  
    #include <sstream>
    
    using namespace std;
    
    int main()
    {
    	int s;
    	struct sockaddr_in addr;
    	int i;
    
    	for (i=0; i<=255 ; i++)
    	{
    	   string ip = "192.168.178.";
    	   string w;
    	   std::stringstream out;
           out << i;
           w = out.str();
    	   ip.insert(12,w);
    	   s = socket(AF_INET, SOCK_STREAM, 0);
    	   addr.sin_family = AF_INET; 
           addr.sin_port = htons(80); 
           addr.sin_addr.s_addr = inet_addr(ip.c_str());
    
           if(!connect(s, reinterpret_cast<sockaddr*>(&addr), sizeof(sockaddr))) 
           cout << "Verbindung mit " << ip << " erfolgreich" << endl;  
         close(s); 
        }
    }
    

    Leider bin ich noch neu auf dem Gebiet und kann mir nicht weiter helfen.
    Ich hab hier erst mal nur die letzte Stelle der IP-Adresse in die For Schleife gepackt, da ich das im Moment noch nicht besser hin bekomm 😃
    Ich glaube das das Problem bei dem Socket liegt, weil das Ausgeben der IP-Adressen als solche funktioniert.



  • Funktioniert hier bestens.

    Ein paar kurze Anmerkungen:

    • ip.insert(12,w); ist furchtbar. Das ist unheimlich unwartbar (habe die IP auf "192.168.0." umgeschrieben und dann crasht das Programm mit Deinem Code) und nicht idiomatisch, mach einfach ip += w; Bzw. bei genauerer Betrachtung ist w ohnehin nicht sehr sinnvoll, Du kannst das direkt an ip dranhängen und fertig.
    • for (i=0; i<=255 ; i++) ist unsinnig, typischerweise ist ".255" nämlich die Broadcast-Adresse, die solltest Du eher weglassen. Und mit "i=0" anzufangen ist auch nicht clever, "i=1" wäre sinnvoller.
    • In for-Schleifen definiert man die Variable typischerweise auch gleich direkt, also for (int i=1; i<42; ++i) statt vorher definieren.


  • Erstmal Danke für die Tipps.
    Ich benutze jetzt diesen Code

    #include <iostream>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h> 
    #include <arpa/inet.h> 
    #include <unistd.h>
    #include <string>  
    
    using namespace std;
    
    int main()
    {
    	int s;
    	struct sockaddr_in addr;
    
    	for (int i=1; i<=42 ; ++i)
    	{
    	   string ip = "192.168.178.";
    	   ip += i;
    	   s = socket(AF_INET, SOCK_STREAM, 0);
    	   addr.sin_family = AF_INET; 
           addr.sin_port = htons(80); 
           addr.sin_addr.s_addr = inet_addr(ip.c_str());
    
           if(!connect(s, reinterpret_cast<sockaddr*>(&addr), sizeof(sockaddr))) 
           cout << "Verbindung mit " << ip << " erfolgreich" << endl;  
         close(s); 
        }
    }
    

    leider funktioniert es immer noch nicht bzw. er findet nix nicht mal mich selbst



  • Sorry, die Stringstreams brauchst Du leider doch. Eigentlich wollte ich diesen Punkt wieder wegeditieren. Dass der Schwachsinn ist, ist mir schon vor dem Posten aufgefallen.

    Dein Code oben passt an sich schon, Du solltest nur eben .0 und .255 nicht scannen. Das hier funktioniert für mich zB. gut:

    #include <iostream>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    int main() {
      for (int i=10; i<15 ; ++i) {
        string ip = "192.168.0.";
        stringstream out;
        out << i;
        ip += out.str();
        int s = socket(AF_INET, SOCK_STREAM, 0);
        struct sockaddr_in addr;
        addr.sin_family = AF_INET;
        addr.sin_port = htons(80);
        addr.sin_addr.s_addr = inet_addr(ip.c_str());
    
        if(!connect(s, reinterpret_cast<sockaddr*>(&addr), sizeof(sockaddr)))
          cout << "Verbindung mit " << ip << " erfolgreich" << endl;
        close(s);
      }
    }
    


  • luggas schrieb:

    leider funktioniert es immer noch nicht bzw. er findet nix nicht mal mich selbst

    Naja, "findet" ist gut. Hast Du lokal einen Webserver laufen? Du versuchst schließlich, Dich zu Port 80 zu verbinden. Wenn der zu ist, dann hast Du damit natürlich kein Glück.


Anmelden zum Antworten