verwaltung von ip adressen C++



  • Hallo ich habe so eine Aufgabe bekommen und verstehe nicht ganz wie ich es mit Arrays machen soll. Ihc würde auf eure Hilfe Freuen.
    Das ist Aufgaben stellung

    • Es sollen die IP-Adressen auf Plausibilität geprüft werden. Es soll nicht möglich sein, dass ein Byte einen Wert über 255 erhält (z.B. 256.101.100.99)
    • Es soll ein weiterer Menüpunkt hinzugefügt werden, mit dem alle und nur die vorhande-nen IP-Adressen ausgegeben werden. (das Array ist eine sinnvolle Lösung)

    Das ist der code:

    #include <iostream>
    using namespace std;

    int main()
    {
    int ip_adr[100][3];
    double ip_adr_zus[100]
    int aktNr, i, wahl;

    do {
    	cout << " \n\n Verwaltung von IP-Adressen \n\n";
    	cout << " Eingabe einer IP-Adresse      - 1\n";
    	cout << " Ausgabe einer IP-Adresse      - 2\n";
    	cout << " Ueberpruefung der IP-Adresse  - 3\n";
    

    cout << " Ausgabe aller IP-Adressen - 4\n";
    cout << " Programmende - 10\n";
    cin >> wahl;

    	// eingabe einer IP-Adr
    	if (wahl == 1)
    	{
    cout << "Eingabe einer IP-Adr: Welche Nr. wollen Sie neu eingeben (0..100)\n";
    		cin >> aktNr;
    		for (i = 0; i < 4; i++) {
    			cout << "Geben Sie Byte Nr " << i + 1 << "der Adresse ein:  ";
    			cin >> ip_adr[aktNr][i];
    		}
    	}
    	if (wahl == 3)
    	{
    

    //pruefung(aktNr, ip_adr[aktNr][0], ip_adr[aktNr][1], ip_adr[aktNr][2], ip_adr[aktNr][3]);
    }
    // Ausgabe der IP-Adresse
    if (wahl == 2)
    {
    cout << "Ausgabe einer IP-Adr: Welche Nr. wollen Sie neu ausgeben (0..100)\n";
    cin >> aktNr;
    for (i = 0; i < 3; i++) {
    cout << ip_adr[aktNr][i];
    cout << ".";
    }
    cout << ip_adr[aktNr][i] << "\n\n ";
    }
    } while (wahl != 10);
    }



  • @Scrafter sagte in verwaltung von ip adressen C++:

    Es sollen die IP-Adressen auf Plausibilität geprüft werden. Es soll nicht möglich sein, dass ein Byte einen Wert über 255 erhält (z.B. 256.101.100.99)
    Es soll ein weiterer Menüpunkt hinzugefügt werden, mit dem alle und nur die vorhande-nen IP-Adressen ausgegeben werden. (das Array ist eine sinnvolle Lösung)

    So sollst du es bestimmt nicht machen, aber man kann ja mal spicken:

    $ perl -E'use Regexp::Common; say $RE{net}{IPv4}' 
    (?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2}))
    

    Also in C++

    #include <regex>
    #include <iostream>
    #include <string>
    
    int main() {
        auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})[.](?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})))""");
    
        std::cout << "Bitte IP-Adresse eingeben:\n";
        std::string s;
        while (std::getline(std::cin, s)) {
            if (std::regex_match(s, re_ipv4)) 
                std::cout << "Gültig\n";
            else
                std::cout << "Ungültig\n";
            std::cout << "Eine weitere IP-Adresse eingeben:\n";
        }
    }
    

    (SCNR)



  • @Scrafter sagte in verwaltung von ip adressen C++:

    int ip_adr[100][3];

    Ernsthafte Antwort (auch wenn meine vorherige AW funktioniert):
    Wenn du C++ machst, solltest du nicht festgelegte Arrays nehmen, sondern passende Container. Praktisch immer kommt dafür std::vector in Frage, häufig aber auch std::map.

    Dein Array hat zudem noch die falsche Größe: 100 x 3 integers kannst du speichern. a.b.c.d hat aber 4 Zahlen, nicht 3. Außerdem reicht dafür std::byte (ein 8-Bit-Wert).

    Ansonsten böte sich auch sowas wie https://www.boost.org/doc/libs/1_76_0/doc/html/boost_asio/reference/ip__address/make_address.html an. Aber du sollst das bestimmt manuell machen 🙂

    In der Aufgabe steht nur "IP-Adresse", aber dann wird mit IPv4 weitergemacht. IPv6 solls nicht sein?



  • Bitte formatier´ deinen kompletten Quelltext. Du kannst im Editor den kompletten Quelltext mit der Maus markieren und über den </> Button formatieren.

    Am Besten machst du das gar nicht mit den Arrays, denn das Array ist eine sinnvolle Lösung ist Quark und zeigt, dass der Aufgabensteller selbst keine Ahnung von C++ hat.
    Zunächst solltest du dir Gedanken über eine sinnvolle Datenstruktur einer IPv4 Adresse machen. Das kann eine Struktur wie

    struct IPAddressV4
    {
       std::uint8_t Octet1 = 0;
       std::uint8_t Octet2 = 0;
       std::uint8_t Octet3 = 0;
       std::uint8_t Octet4 = 0;
       
       IPAddressV4() = default;
    };
    

    oder auch nur ein einfacher std::uint32_t sein, in dem jedes Byte ein Oktett der IPv4 Adresse repräsentiert. Diese Dinge kannst du dann in einen std::vector stecken. std::vector hat den Vorteil, dass er seine Größe automatisch anpasst.
    Außerdem würde ich die main Funktion in mehrere Funktionen aufbrechen:

    #include <iostream>
    #include <string>
    #include <vector>
    #include <cstdint>
    
    struct IPAddressV4
    {
       std::uint8_t Octet1 = 0;
       std::uint8_t Octet2 = 0;
       std::uint8_t Octet3 = 0;
       std::uint8_t Octet4 = 0;
    
       IPAddressV4() = default;
    };
    
    int choice()
    {
       std::cout 	<< "Bitte wählen Sie eine Aktion aus:\n"
    		<< "1) eine neue IP Adresse eingeben\n"
    		<< "2) eine IP Adresse löschen\n"
    		<< "3) Liste der IP Adressen ausgeben\n"
    		<< "0) Programm beenden\n";
       for( ;; )
       {
          std::cout << "Ihre Wahl: ";
          int input;
          std::cin >> input;
          if( std::cin && input < 4 )
          {
             return input;
          }
          else
          {
             // inputstreams sind etwas umständlich zu behandeln, wenn die Eingabedaten
             // nicht zum zu lesenden Datentyp passen. Die nächsten zwei Zeilen löschen alle Zeichen
             // bis zum nächsten Linefeed (effektiv die ganze Benutzereingabe)
             std::cin.clear();
             std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
          }
       }
    }
    
    void add_address( std::vector<IPAddressV4>& addresses )
    {
       // TO DO:
       // Adresse eingeben und dem Vektor hinzufügen
    }
    
    void remove_address( std::vector<IPAddressV4>& addresses )
    {
       // TO DO:
       // Index eingeben und entsprechendes Element aus dem Vektor entfernen
    }
    
    void list_addresses( std::vector<IPAddressV4>& addresses )
    {
       // TO DO:
       // Vektor durchlaufen und IP Adressen ausgeben
    }
    
    int main()
    {
       std::vector<IPAddressV4> addresses;
    
       for( int ch = choice();
            ch != 0;
    	ch = choice() )
       {
          if( ch == 0 )      add_address( addresses );
          else if( ch == 1 ) remove_address( addresses );
          else if( ch == 2 ) list_addresses( addresses );
       }
    }
    


  • @DocShoe sagte in verwaltung von ip adressen C++:

    struct IPAddressV4
    {
    std::uint8_t Octet1 = 0;
    std::uint8_t Octet2 = 0;
    std::uint8_t Octet3 = 0;
    std::uint8_t Octet4 = 0;

    IPAddressV4() = default;
    };

    Hm... Warum nicht mit Array? Variablennamen mit ...0, ...1, ...n schreien doch geradezu danach.

    struct IPAddressV4
    {
        std::uint8_t[4] octets;
    }
    


  • Oder so.
    Oder von mir aus auch

    struct IPAddressV4
    {
       std::array<std::uint8_t,4> Octets;
    };
    

    Nur halt kein

    int[100][3]
    

    deshalb schrub ich ja sinnvolle Datenstruktur, da kann sich jeder austoben.



  • @DocShoe sagte in verwaltung von ip adressen C++:

    struct IPAddressV4
    {
    std::uint8_t Octet1 = 0;

    Das uint8_t widerspricht aber der Aufgabe, den Wertebereich der Zahlen zu überprüfen.

    Angenommen, die Werte werden aus einer Datei eingelesen, dann kann immer noch ein Anwender daran rum pfuschen.

    Da ist eine Wertüberlauf immerhin eine Fehlererkennung.



  • This post is deleted!


  • Danke für eure Hilfe, das ist echt hilfreich



  • @wob sagte in verwaltung von ip adressen C++:

    In der Aufgabe steht nur "IP-Adresse", aber dann wird mit IPv4 weitergemacht. IPv6 solls nicht sein?

    Das weiß ich wirklich nicht es steht auch nirgends ob man auch IPv6 nutzen kann aber ich mache es mit IPv4



  • @Scrafter sagte in verwaltung von ip adressen C++:

    @wob sagte in verwaltung von ip adressen C++:

    In der Aufgabe steht nur "IP-Adresse", aber dann wird mit IPv4 weitergemacht. IPv6 solls nicht sein?

    Das weiß ich wirklich nicht es steht auch nirgends ob man auch IPv6 nutzen kann aber ich mache es mit IPv4

    Es ist eine Übungsaufgabe zur Lösungsfindung und Umgang mit Arrays.
    Da gibt es keinen praktischen Nutzen für 🤷♂



  • @wob sagte in verwaltung von ip adressen C++:

    auto re_ipv4 = std::regex(R"""((?:(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9]{1,2})...))""");

    while (std::getline(std::cin, s)) {
    if (std::regex_match(s, re_ipv4))

    Könntest du bitte kurz erklären was diese abschnitte bedeuten?



  • Solange eine Zeile per getline() von cin nach s gelesen werden kann
    prüfe ob die Regular Expression re_ipv4 auf s passt.

    Aber mit RegEx sollst Du es wahrscheinlich eh nicht machen.


Log in to reply