Welchen Datentyp für eine IP Adresse?



  • @Ivo

    hmm also ich glaube du willst ein program schreiben wo du eine
    ip eingibst und diese dann angepingt wird?!

    ich denke das mit der ip eingeben wirst du schon schaffen,
    hier ist ein beispielprogram für einen ping-befehl
    http://www.c-worker.ch/winsock/ping.cpp

    du kannst aber auch einen systembefehl ausführen system("ping...");



  • @babelduo

    Genau! Mein Chef hat sich in die Birne gesetzt, schreib mal schnell ein Programm womit ich die Domäne nach bestimmten Dateien durchsuchen kann. Unsere Domäne ist ca. 180 Rechner, das Adminkennwort hab ich ja, kein Wunder beim AdminPosten 😉

    Ich dachte mir das so:
    Erst alle anpingen, ob alle da sind, deshalb ip_begin und ip_end, dann Netzlaufwerk verbinden und suchen....

    Und das ganze in C++, Chef meinte: Hast ja da ein dickes Buch, kann ja nicht so wild sein.... 😡

    Gruß Ivo



  • mhhh naja wenners meint 😉

    @babelduo

    #include <stdlib.h>
    #include <iostream.h>
    

    so fängt dass prog schon an .. naja gibt ja vielleicht wichtigeres als auf den standart achten 😮

    naja ausserdem denke ich nicht dass es

    du kannst aber auch einen systembefehl ausführen system("ping...");

    geben sollte ...
    ich meine klar gibts dass . aber leider 😡

    joa mehr hab ich nicht zu meckern 🤡



  • Was spricht denn dagegen einen Systembefehl auszuführen? Das System ist doch eh Windows bei uns......

    Das grobe Konzept für das Programm steht ja, nur die Umsetzung ist für einen Anfänger recht schwer....

    Gruß Ivo



  • heulen könnts jeden tag system(bla);

    nicht nehmen weil
    system(); zu vermeiden ist -->link guxxen 😉



  • truebool schrieb:

    so fängt dass prog schon an .. naja gibt ja vielleicht wichtigeres als auf den stan**** achten 😮

    äh, ja. Zum Beispiel Dinge zu bewältigen die vom C++-Standard nicht abgedeckt sind.

    naja ausserdem denke ich nicht dass es

    du kannst aber auch einen systembefehl ausführen system("ping...");

    geben sollte ...
    ich meine klar gibts dass . aber leider 😡

    So ein Blödsinn. Wieso sollte es den nicht geben?

    Was spricht denn dagegen einen Systembefehl auszuführen? Das System ist doch eh Windows bei uns......

    Grundsätzlich nichts. Man sollte sich nur im klaren sein, was die Funktion denn macht und das es viele Situationen gibt, wo man sie besser nicht einsetzen sollte. Das steht in dem Link zur FAQ.

    Abgesehen davon, bringt dir ein system(ping) auch nicht viel, da du den Rückgabewert nicht ohne weiteres auswerten kannst.



  • Zitat:

    naja ausserdem denke ich nicht dass es
    Zitat:
    du kannst aber auch einen systembefehl ausführen system("ping...");

    geben sollte ...
    ich meine klar gibts dass . aber leider

    So ein Blödsinn. Wieso sollte es den nicht geben?

    steht da es gibts nicht ?? denke ich nicht

    zitat ich oben

    ich meine klar gibts dass . aber leider

    naja ich denke man sollte aber nicht die schlechtere variante nehmen wenns auch ohne geht .. natürlich treffen nicht immer alle nachteile zu

    so fängt dass prog schon an .. naja gibt ja vielleicht wichtigeres als auf den stan**** achten

    ich denke aber man kann <iostream> statt <iostream.h> nehmen und auch <cstdbib>
    ist machbar und nicht <stdlib.h>
    und von daher deckt der standart dies schon 🤡
    auf was anderes war meine aussage auch nicht bezogen (@zitat hesder)

    Grundsätzlich nichts. Man sollte sich nur im klaren sein, was die Funktion denn macht und das es viele Situationen gibt, wo man sie besser nicht einsetzen sollte. Das steht in dem Link zur FAQ.

    Abgesehen davon, bringt dir ein system(ping) auch nicht viel, da du den Rückgabewert nicht ohne weiteres auswerten kannst.

    sachst also selbst er sollte es hier nicht nehmen ..
    naja nächste mal nicht ganz so hart bitte .. 😞
    hab hier nichts böse gemeint ... 😉



  • truebool schrieb:

    So ein Blödsinn. Wieso sollte es den nicht geben?

    steht da es gibts nicht ?? denke ich nicht

    du hast doch geschrieben, "den Befehl sollte es nicht geben". Das meinte ich.

    ich denke aber man kann <iostream> statt <iostream.h> nehmen und auch <cstdbib>
    ist machbar und nicht <stdlib.h>
    und von daher deckt der stan**** dies schon 🤡
    auf was anderes war meine aussage auch nicht bezogen (@zitat hesder)

    Ah, ok. Ich hab nur das windows.h gesehen und ich dachte du beziehst dich darauf. Hab die alten Header gar nicht gesehen.

    naja nächste mal nicht ganz so hart bitte .. 😞
    hab hier nichts böse gemeint ... 😉

    ich auch nicht 🙂

    Es ist hier im Forum so, dass sobald irgendwo system steht, jemand darüber schimpft wie scheisse die Funktion ist und das man sie ja niemals nie verwenden soll. Das nervt etwas.



  • ja kann ich ja verstehen ich meine grade in der letzten woche ist es mir echt oft aufgefallen ( die kritik aber auch wieviele die funktion benutzen )
    ich meine ich hab mich umgeguggt und so viele tuts gesehen die die benutzen ohne auch nua die schwachstellen oder alternativen zu erwähnen ...
    naja aba in diesem fall isse echt nicht so dolle
    1 admin prog und root shell is ja nicht dolle
    2 kann er nicht weiter damit arbeiten wie du schon gesagt hast ..
    ja hätte nicht alles rauskopriren sollen ausm header aber naja is ja nun geklärt denke ich .. also friedenspfeife anbietz.. 😉 👍



  • Nicht das das hier noch als Streitthema ausartet, ich wollte hier keine Grundsatzdiskussion starten.

    Nun möchte ich den kompletten Inhalt zwischen 192.168.0.1 und 192.168.0.255 auflisten, gibt es dafür eine mathematische Funktion aus cmath() oder?
    Wäre für ein Stichwort dankbar, damit ich Google und MSDN fragen kann 😉

    Gruß Ivo



  • du willst

    192.168.0.0
    192.168.0.1
    192.168.0.2
    192.168.0.3
    ...
    192.168.0.254
    192.168.0.255

    ausgeben?

    int a=192;
    int b=168;
    int c=0;
    int d=0;
    
    while(d!=255) {
    printf("%i.%i.%i.%i\n",a,b,c,d);
    d=d+1;
    }
    

    wenn du die jeweilige ip in einer char vai haben willst könntest
    du ja sprintf benutzen, obwohl ich glaube das man sprintf nicht
    benutzen soll, weis aber nciht warum 🙂

    char ip[20];
    sprintf(ip,"%i.%i.%i.%i",a,b,c,d);

    aber vieleicht gibt es auch noch eine andere/bessere lösung



  • Dies ist aber kein echtes Berechnen der IP Adressen im Bereich meiner eingegebenen Anfangs IP und End IP Adresse....
    Dies ist ja nur ein vordefiniertes Ausgeben einer Zahlenreihe, wenn sich mal unser Adressbereich ändert also auf 182.176.0.1 usw.... muß ich ja das Programm wieder ändern, auch wenn neue Rechner hinzukommen....

    Da müß es ne Mathematische Lösung geben.....

    Gruß Ivo



  • ich dachte du wolltest alle ips in einem bereich "berechen"
    und dann anpingen?!

    wenn sich der bereich ändern kann, dann mach es doch so das man
    am anfang den breich eingeben kann - oder ist das ein prob?!

    babel



  • template<class E, class T>
    void range(std::basic_ostream<E,T>& os, unsigned IP_first, unsigned IP_last)
    {
    	for ( ; IP_first <= IP_last; ++IP_first)
    		os << (IP_first & 0xff) << "."
    		   << (IP_first >> 8 & 0xff) << "."
    		   << (IP_first >> 16 & 0xff) << "."
    		   << (IP_first >> 24 & 0xff) << std::endl;
    }
    
    //...
    
    range(std::cout,0,~0); //alle Adressen von 0.0.0.0 bis 255.255.255.255 ausgeben
    


  • Das mit dem Eingeben der IP ist kein Prblem, ich werd es mal schnell änden.
    Nur wie bekommen ich die Ping Anweisung und speicher die Rückmeldung der Rechner? Es recht ja das die IP gespeichert wird, von den Rechnern die geantwortet haben... Ich habe ja auf dotnetmal was von dem ping befehl gelesen, nur das war mit .net und ich mach mein Tool nur für die Konsole... ohne net.

    Gruß Ivo



  • wie gesagt wenn du es sehr venünftig machen willst würde ich mir
    dieses ping-beispiel mal anschauen: http://www.c-worker.ch/winsock/ping.cpp

    aber wenn es nur für den kleinen privaten gebrauch wäre könntest
    du auch systembefehle benutzen, für den rückgabewert pipes

    ...
    const int MAX = 10000;
    
    int main() {
    
    char c[256]="";
    FILE *pipe; 
    pipe = _popen("ping -n 1 192.168.0.1", "r");
    
    while (fgets(c, MAX-1, pipe))
        cout << c;
    }
    ...
    

    der rückgabewert wäre dann in c gespeichert und den könntest du auswerten.



  • Ivo schrieb:

    Dies ist aber kein echtes Berechnen der IP Adressen im Bereich meiner eingegebenen Anfangs IP und End IP Adresse....
    Dies ist ja nur ein vordefiniertes Ausgeben einer Zahlenreihe, wenn sich mal unser Adressbereich ändert also auf 182.176.0.1 usw.... muß ich ja das Programm wieder ändern, auch wenn neue Rechner hinzukommen....

    Da müß es ne Mathematische Lösung geben.....

    Sicher gibt es die und die wurde nun mittlerweile auch schon gepostet. Bevor du anfängst wild drauf los zuprogrammieren, solltest du evtl. erstmal klären ob du die nötigen Kenntnisse zur Lösung des Problems hast, und das bezieht sich jetzt nicht auf deine Programmierfähigkeiten. Also erstmal nen Anfängertutorial über Netzwerke lesen, was sind IP-Adressen,wie sind sie aufgebaut, was ist ne Netzmaske, wie ist sie aufgebaut, welche wichtigen Protokolle gibt es, welches könnte ich benutzen und vieles mehr. Wenn du das ertsmal weisst ist der Rest Kür.

    Mein Tipp:

    Google nach nem Netzwerktut und dann google nach nem Sockettut.
    Alles schön durchlesen und verstehen.
    Dein Program nochmal planen und bei erneuten Schwierigkeiten, die du nicht durch eigene Recherchen lösen kannst, nochmal hier posten.



  • babelduo schrieb:

    wenn du die jeweilige ip in einer char vai haben willst könntest
    du ja sprintf benutzen, obwohl ich glaube das man sprintf nicht
    benutzen soll, weis aber nciht warum 🙂

    char ip[20];
    sprintf(ip,"%i.%i.%i.%i",a,b,c,d);

    Weil sich durch sprintf und Konsorten unter Umständen Formatstringschwachstellen ergeben können. In deinem Beispiel ist es aber eher unproblematisch.



  • @prolog

    Also was meine Kenntisse in Sachen Netzwerke betrifft, die sind relativ hoch anzusiedeln -> ich bin ausgebildeter Netzwerkadmin und mach grad meinen MCSE (falls es Dir was sagt).
    Also wie ein Netzwerk funktioniert weiß ich schon ;), das Problem ist nur das ich in Sachen C++ ein Anfänger bin, aber mir es eben beibringen will.

    Aber ich werde mal Deinen Tipp mit dem Netzwerktutorial beherzigen und mal meinen Freund Google fragen.

    Gruß Ivo



  • @IVO

    dann hab ich deine posts wohl einfach fehl interpretiert.

    Da du dich mit der Materie auskennst kannst du ja Shlos Lösung bentutzen und brauchst dich nur mit Bitoperatoren in C++ auseinander zusetzen um die Kernfunktionalität zu verstehen.

    Dann musst du dich trotzdem noch mit Sockets auseinander setzen. Wenn du keine ICMP-API zur Hand hast musst du dich insbesondere mit raw sockets beschäftigen.

    Im Prinzip ist es einfach. Leg für jeden Host in der Range deines Netzes nen ICMP-echo-req aufs segment und warte auf nen reply.

    Wenn du nicht alles von Hand machen willst kannst du ja z.B. mal nach libnet googlen auch wenn es eine C-API ist.


Anmelden zum Antworten