PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Validieren von IP-Adresse ohne RegEx



7.e.Q
13-07-2006, 10:08
Hi Leute,

ich möchte überprüfen, ob das Format eines std::string dem einer IP Adresse entspricht, also ob der String eine vom Format her gültige IP enthält. Ich habe aber keine regulären Ausdrücke zur Verfügung.

Zur Zeit prüfe ich, ob die Länge >= 7 ist und ob der String mindestens 1 Punkt ('.') enthält. Wenn ja, sage ich, die IP ist okay. Ist natürlich sehr verbesserungswürdig.

Jemand 'ne Idee? 'n Snippet?

Danke

Gruß,
Hendrik

peschmae
13-07-2006, 10:46
Hallo,

ich denke mal das hängt erst mal von dir ab welches Eingabeformat du genau erzwingen willst.

Je nach dem kann man die IPs ja auch in Hexadezimal oder Oktalform angeben - u.U. auch ganz ohne Punkte wie z.B. hier (http://www.pc-help.org/obscure.htm) erwähnt.

MfG Peschmä

bischi
13-07-2006, 10:54
Bei IPv4 ist es jeweils so:

Zahl von 0-255
Punkt
Zahl von 0-255
Punkt
Zahl von 0-255
Punkt
Zahl von 0-255

MfG Bischi

anda_skoa
13-07-2006, 16:16
Ich würde den String in einen Stringstream geben und dann int und chars (für die Punkte) auslesen.
Der Stream muß danach OK sein, die Chars müssen Punkte sein und die ints zwischen 0 und 255

Geht natürlich nur für IPv4, IPv6 wird schon schieriger, weil es da bekanntlich Abkürzungen gibt

Ciao,
_

7.e.Q
14-07-2006, 07:20
Also in erster Linie geht es erstmal um IPv4. IPv6 kommt später. Da schreibe ich dann eine separate Funktion für.

@bischi: Ich für meinen Teil weiß, wie IP Adressen ausschauen. Nur dies dem Programm auch beizubiegen, darum geht's.

@peschmae: Eingabeformat ist definitiv dezimal mit Punkten. Keine Portangaben. Also ausschließlich als "???.???.???.???".

bischi
14-07-2006, 08:37
@bischi: Ich für meinen Teil weiß, wie IP Adressen ausschauen.
dann ist das Problem ja gelöst:

drei mal readDigit
einmal readChar
...

und jeweils Fehler abfangen (dh. zuerst prüfen: isDigit, isChar) und die digits zusammenhängen: d=d1+10*d2+100*d3 und danach überprüfen, ob die Zahl kleiner 255 ist.

MfG Bischi

quinte17
14-07-2006, 10:04
hier mal eine nette kleine ausnahme, die nicht bei allen browsern funzt, aber bei vielen:
http://3639551848/

greetz

anda_skoa
14-07-2006, 16:43
#include <iostream>
#include <string>
#include <sstream>

bool isValidIP(const std::string& input)
{
std::stringstream stream(input);
int a, b, c, d;
char dot1, dot2, dot3;

stream >> a >> dot1 >> b >> dot2 >> c >> dot3 >> d;
if (stream.bad()) return false;

if (a < 0 || a > 255) return false;
if (b < 0 || b > 255) return false;
if (c < 0 || c > 255) return false;
if (d < 0 || d > 255) return false;

if (dot1 != '.' || dot2 != '.' || dot3 != '.') return false;

return true;
}

int main(int argc, char** argv)
{
for (int i = 1; i < argc; ++i)
{
std::string input(argv[i]);

if (isValidIP(input))
std::cout << input << " is a valid IP address" << std::endl;
else
std::cout << input << " is NOT a valid IP address" << std::endl;
}
}


Ciao,
_

Joghurt
16-07-2006, 12:36
Wie wäre es damit?
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int IsValidIP(const char* ip)
{
return (inet_addr(ip) != -1);
}Das hat den Vorteil, dass z.B auch 3639551848 und 0xD8EF276 als gültige IP angesehen wird (was sie ja auch sind). Einzig und allein 255.255.255.255 wird fälschlicherweise als ungültig erachtet.

Da du aber wohl verhindern willst, dass jemand "67857" als IP angibt und diese als gültig erachtet wird, schau zusätzlich noch nach, ob ein Punkt drin ist (das sollte dann hinreichend sein)

return (index(ip, '.') && inet_addr(ip) != -1);Ich denke mal, dass du nicht noch testen willst, ob es nun auch wirklich eine Class A, B oder C-Adresse ist

7.e.Q
17-07-2006, 08:28
Nein, die Art des Netztes muss nicht getestet werden. Nur eben, ob das Format der eingegebenen IP korrekt ist. Gibt dein Term bei 0.0.0.0 false oder true zurück (bin gerade zu faul zum Testen, ist Montag ;) )?

Joghurt
17-07-2006, 19:00
0.0.0.0 ist vom Format her korrekt...