char** argv -> ip-adresse -> prüfen



  • hallo,

    gibt es bereits eine funktion im c++ sprachumfang die eine per programmparameter(char** argv) übergebene ip-adresse validiert?

    wenn nein, wie am besten lösen?

    grüsse grizzel



  • ip adressen haben recht wenig mit dem c++ standard zu tun.

    also wenn du wirklich rausbekommen willst, ob ne ip existiert

    Es gibt aber ne menge erweiterungen / API's vom BS die sich damit beschaeftigen, auch par tolle libs dazu .....
    Also c++ wird dir da gar ned helfen, aber Dein BS vielleicht, bzw deren API's (WinAPI, Posix, SystemV).
    Frameworks die das auf eine einheitliche Ebene hieven, waeren wxWidgets, QT ... und noch paar mehr.

    Da wir natuerlich ned hellsehen koennen, was du genau benutzt ...

    willst nur checken, ob das ding ne ip sein könnte ....
    also immer 1-3ziffern, punkt, 1-3ziffern, punkt, 1-3ziffern, punkt, 1-3ziffern ...
    dann helfen dir vielleicht regular expressions weiter ... auch ned im c++ standard, aber in diversen bibs unterstuetzt ....

    Ansonsten, handarbeit 🙂

    Ciao ...



  • willst nur checken, ob das ding ne ip sein könnte ....
    also immer 1-3ziffern, punkt, 1-3ziffern, punkt, 1-3ziffern, punkt, 1-3ziffern ...

    genau das will ich 😉

    es scheint ich muss hand anlegen 😉

    c++ mit g++ auf linux

    danke



  • Du könntest das recht simpel mit boost::regex oder Poco::RegEx lösen.



  • Das geht auch mit Streams oder gar mit sscanf ziemlich simpel. 😉



  • Das geht mit der Funktion inet_addr.



  • Ach sorry, ist wahrscheinlich doch nicht was du suchst, da die Funktion mehrere Formen akzeptiert.



  • ich versuche mit <regex.h> und regexec() regcomp() die ip zu validieren.

    int isIp(char* ip)
    {
    	int result;
    	regex_t reg;
    	if (regcomp(&reg,"\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b",REG_EXTENDED|REG_NOSUB)!=0) 
    	{
    		return -1;
    	}
    		result = regexec(&reg, ip, 0, 0, 0);
    		regfree(&reg);
    		return result;
    }
    

    compiler ausgabe:

    g++ -Wall -c client.cpp -o peer_01.o
    client.cpp: In function 'int isIp(char*)':
    client.cpp:28: error: unknown escape sequence '\.'
    client.cpp:28: error: unknown escape sequence '\.'
    client.cpp:28: error: unknown escape sequence '\.

    wieso mag er das \. nicht??



  • grizzel schrieb:

    ...
    wieso mag er das \. nicht??

    Was soll denn '\.' Deiner Meinung nach sein ?

    Merke: Ein einzelnes \ kennzeichnet nur ein "Achtung, jetzt kommt ein Sonderzeichen" (= "escape character", der eine "escape sequence" einleitet) ... und davon kennt der compiler nur ein paar (u.a. das b, das Du ganz am Anfang verwendest -> '\b'; aber eben kein '\.'.
    Beide zusammen bilden nur EIN Zeichen.
    Wenn man das Zeichen \ darstellen will, macht man das über '\' (= "Achtung: Hier soll ein backslash stehen").

    Gruß,

    Simon2.



  • \.
    soll meiner meinung nach sagen: ACHTUNG jetzt kommt ein . und nicht das sonderzeichen .

    ???



  • grizzel schrieb:

    \.
    soll meiner meinung nach sagen: ACHTUNG jetzt kommt ein . und nicht das sonderzeichen .

    Was den Regulären Ausdruck angeht hast du schon Recht, es geht hier aber um C++. Um in einem C/C++-String ein '\' zu schreiben, muß im Quelltext '\' stehen. Dementsprechend mußt du hier '\.' schreiben. Der erste Backslash ist für den Compiler, der zweite für den RegEx. Etwas unübersichtlich, aber wenn man drüber nachdenkt ergibt das schon Sinn 🙂



  • hab diesen regulären ausdruck gebaut um ip adressen zu validieren:

    ^((2[0-5][0-5]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(2[0-5][0-5]|1[0-9][0-9]|[1-9][0-9]|[0-9])$

    mögliche adressen: 0.0.0.0 - 255.255.255.255


Anmelden zum Antworten