Unbekannte in Strings

  • C++

  • Lümmel
  • 1686 Aufrufe 10 Antworten

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Unbekannte in Strings

    Hi,

    ich suche eine Möglichkeit, einen String (in diesem Fall eine IP) in der Form xxx.xxx.xxx.xxx einzugeben (zB 192.168.0.xxx für ein lokales Subnet) und alle x durchzuzählen (so dass ich in dem Beispiel 192.168.0.0-192.168.0.255 als einzelne Strings bzw neuen Array erhalten würde).

    Hat jemand eine Ahnung ob sowas überhaupt möglich ist und wenn dann wie ich das bewerkstelligen könnte?

    Gruß
    Der Lümmel
  • Also erstmal: ich mache das ganze ohne GUI (wird eine Konsolenanwendung).

    Zum verständnis: Ich will einen IP-Scanner bauen der verschiedene Subnets scannen kann. Damit er auch weiß was genau er scannen soll, muss ich natürlich eine Art IP-Bereich eingeben. Und das würde ich am liebsten eben so machen, dass man den Bereich der IP, der nicht feststeht, als xxx angeben kann. Sprich: 192.168.0.xxx für 192.168.0.0 bis 192.168.0.255.
    Schön wäre es außerdem wenn man noch einzelne Ziffern als x angeben könnte (zB 192.168.0.1xx für 192.168.0.100 bis 192.168.0.199) aber erstmal würde es eigentlich auch reichen zwischen den Punkten trennen zu können.

    Ich hoffe mal das ist jetzt verständlich, weiß nicht wie ich es sonst ausdrücken sollte ;)
  • Jo in Java könnt ichs auch... :)

    Aber ich möchte ja c++ lernen => brauche eine Methode wie es da geht. Ich habe mitlerweile schon etwas mit strtok und strtok_s rumprobiert aber irgendwie bin ich dafür zu doof (könnte an den Zeigern liegen^^).

    Vllt könnte mir ja jemand anfängerfreundlich erklären wie man diese beiden Funktionen (oder auch nur strtok_s weil strtok ist laut vs2005 zu "unsicher") benutzt? Das wäre schön und würde mein Problem wahrscheinlich lösen.
  • Das ist zwar nicht ganz das, was du suchst, aber vllt kannst du es für deine Zwecke umbauen oder es hilft dir zumindest weiter. Die Funktion, die du suchst, heist im Übrigen "sprintf"

    Das Script erwartet als Parameter die erste und die letzte IP und gibt darauf hin alle IPs dazwischen aus:

    PHP-Quellcode

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. unsigned long int ip_str2dec(string sIP)
    5. {
    6. int iIPVector[4];
    7. unsigned long int iDecIP;
    8. int iPos;
    9. string sTemp;
    10. char cTemp[3];
    11. for (int i=0;i<3;i++)
    12. {
    13. iPos = sIP.find(".");
    14. if ((iPos == 0) || (iPos > 14))
    15. {
    16. return 0;
    17. }
    18. else if (iPos > 0)
    19. {
    20. sTemp = sIP.substr(0,iPos);
    21. iIPVector[i] = atoi(sIP.c_str());
    22. if ( (iIPVector[i] < 0) || ( iIPVector[i] > 255) )
    23. {
    24. return 0;
    25. }
    26. int iTemp=sIP.length();
    27. sIP = sIP.substr(iPos+1,iTemp);
    28. }
    29. }
    30. iIPVector[3] = atoi(sIP.c_str());
    31. if ( (iIPVector[3] < 0) || (iIPVector[3] > 255) )
    32. {
    33. return 0;
    34. }
    35. iDecIP = iIPVector[0] << 24 | iIPVector[1] << 16 | iIPVector[2] << 8 | iIPVector[3];
    36. return iDecIP;
    37. }
    38. string ip_dec2str(unsigned long int uiIP)
    39. {
    40. char temp[15];
    41. char * cIP = temp;
    42. sprintf(cIP, "%d.%d.%d.%d", uiIP >> 24 & 0xff, (uiIP >> 16) & 0xff, (uiIP >> 8) & 0xff, uiIP & 0xff);
    43. string sIP = cIP;
    44. return sIP;
    45. }
    46. void main(int argc, char *argv[])
    47. {
    48. unsigned long int iStartIP;
    49. unsigned long int iEndIP;
    50. // DEBUG // cout << argv[0] << "\n" << argv[1] << "\n" << argv[2] << "\n" << argv[3];
    51. if (argc<3)
    52. {
    53. cerr << "Please supply Start-IP AMD End-IP !" << endl;
    54. }
    55. else
    56. {
    57. iStartIP = ip_str2dec(argv[1]);
    58. iEndIP = ip_str2dec(argv[2]);
    59. // DEBUG //cout << "Processing: " << ip_dec2str(iStartIP) << " - " << ip_dec2str(iEndIP) << endl;
    60. }
    61. for (unsigned long int temp=iStartIP;temp<iEndIP+1;temp++)
    62. {
    63. cout << ip_dec2str(temp) << endl;
    64. }
    65. }
    Alles anzeigen


    Ja, ich weiss, es geht auch einfacher, aber das hier hab ich auf die schnelle im Bestand gefunden ;)
  • Erstmal danke für den Code, der macht ja im Prinzip ganz was ähnliches wie ich will.

    Allerdings hab ich das wohl etwas falsch ausgedrückt, worum es mir geht: Das primäre Ziel ist nicht, nen lauffähigen IP-Scanner zu bauen, sondern zu kapieren, wie man in c++ Strings parsed (ich hoffe das ist jetzt richtig eingedeutscht :D), mit den tokens weiterarbeitet und "Variablen" (meine xxx) innerhalb eines Strings benutzt. Wie gesagt, ich will c++ lernen :)

    Hier ist mal mein Code wie er bisher aussieht (falls jemandem ne Methode einfällt, einfach mitten reinschmieren bitte :)):

    PHP-Quellcode

    1. #include <iostream>
    2. #include <sstream>
    3. #include <string>
    4. #include <stdio.h>
    5. using namespace std;
    6. int main(void)
    7. {
    8. while(1)
    9. {
    10. string ip;
    11. string befehl = "ping ";
    12. string befehl2 = " -n 1";
    13. cout << "Bitte IP eingeben: ";
    14. cin >> ip;
    15. befehl += ip;
    16. befehl += befehl2;
    17. system(befehl.c_str());
    18. }
    19. return 0;
    20. }
    Alles anzeigen


    Also ne beliebige IP pingen kann er schon, jetzt geht es halt darum dass er auch ganze Bereiche durchpingen kann.

    PS: Die while-Schleife hat keinen höheren Zweck oder sowas, die ist da nur damit die blöde Eingabeaufforderung nicht immer direkt nach dem Ausführen zu geht ;)
  • Naja aber das wichtigste steht eigentlich auch drin in dem Code.
    Die wichtigsten Funktionen sind hierbei halt:
    find() Zeichen finden und position ausgeben
    substr() Teilstring extrahieren
    atoi() String in Zahlen umwandeln
    length() Länge des Strings
    c_str() War mir bisher total unbekannt und ist es noch ^^

    Damit sollte es doch eigentlich machbar sein.
  • Jo stimmt, parsen kann ich damit schonmal... hab den Code nur nicht so ganz verstanden *schäm* ^^
    bleibt nurnoch die Frage mit den xxx

    PS: c_str() gibt einen char* zurück, die wurden in C für Strings benutzt... wurde mir vorhin gerade erklärt ;)
  • Ich würd mir ne Klasse IPAdresse Schreiben, dann aus den IP strings die einzelnen NetzKlassen auslesen (123.234.111.222 123 = Klasse A, 234 = Klasse B etc) und daraus dann ein Objekt erstellen.

    dann könntest du von rückwerts die IP's durchgehen (Klasse D bis A) indem du die min und max adressen vergleichst....

    Keine ahnung ob du verstanden hast was ich meine :D
    [SIZE="1"]i'm a signature virus. copy me into your signature to help me spread. - smart questions[/SIZE]
  • Doch ich habs verstanden ;)
    Ich weiß zwar nicht genau wie aber das werd ich schon rausfinden.
    thx

    EDIT: Habs hinbekommen, danke nochmal an alle die geholfen haben. Falls die Lösung jemanden interessiert => PM an mich.
    @ Mods: hier kann dann zugemacht werden.