Funktion für Umwandlung von IP
-
Hi,
Ich will gerade eine Funktion schreiben, die mir eine "DottedIP" aus dem Format "123.123.123.123" in eine IP als einen unsigned long-Wert ausgibt, wie sie auch im Netzwerk benutzt wird. Bisher muss man für jede Stelle 3 Zeichen benutzen und Fehlerabfragen sind auch noch keine drinne, aber es geht nicht. Das hier ist mein Code:
long iptolong(char *ipstring) { char tmpstring[2]; unsigned long iplong; char i=0; if (strlen(ipstring)!=15) return -1; for (i=0;i<4;i++) { tmpstring[0]=ipstring[0+(i*4)]; tmpstring[1]=ipstring[1+(i*4)]; tmpstring[2]=ipstring[2+(i*4)]; iplong = iplong + ((256*(i-3))* ((tmpstring[2]-48)+((tmpstring[1]-48)*10)+((tmpstring[0]-48)*100))); } return iplong; }
Ich hole zuerst 3 Bytes Platz für die je 3 Zeichen pro Stelle. Dann mache ich eine Schleife für die 4 Stellen. In jeder überschreibe ich die Zeichen in das temporäre Array und addiere sie dann zu dem schon gespeicherten unter Einbezug der Stelle und so weiter.
Nur gehts nicht!
Währe froh mir könnte jemand helfen. Gibt es eine solche Funktion in der Standartlib? Ich futschle gerade mit SDL_net rum, vielleicht gibt es ja da sowas, ich habe sowas noch nicht entdeckt.
Vielen Dank,
joachim_neu
-
Ups... Hatte einen mathematischen Fehler, sorry. Jetzt geht es:
long iptolong(char *ipstring) { char tmpstring[2]; unsigned long iplong; char i=0; if (strlen(ipstring)!=15) return -1; for (i=0;i<4;i++) { tmpstring[0]=ipstring[0+(i*4)]; tmpstring[1]=ipstring[1+(i*4)]; tmpstring[2]=ipstring[2+(i*4)]; iplong = iplong * 256; iplong = iplong + ((tmpstring[2]-48)+((tmpstring[1]-48)*10)+((tmpstring[0]-48)*100)); } return iplong; }
joachim_neu
-
inet_addr()
http://bama.ua.edu/cgi-bin/man-cgi?00+00
-
die stärke der scanf()-funtionen ist, daß sie ein, wenn auch primitives, parsing des eingabe-strings erlauben.
int iptolong (char *ipstring, unsigned long *iplongp) { unsigned ip[3]; unsigned long iplong; int i; i=sscanf(ipstring,"%u.%u.%u.%u",&ip[0],&ip[1],&ip[2],&ip[3]); /* fehler, wenn nicht alle vier werte gelesen werden konnten */ /* oder werte nicht im gültigen bereich liegen */ if(i!=4 || ip[0]>255 || ip[1]>255 || ip[2]>255 || ip[3]>255) return 0; for(i=0,iplong=0; i<4, i++) iplong=(iplong<<8)+ip[i]; *iplongp=iplong; return 1; }
deine methode, einen fehler mit iplong==-1 zu melden, ist unsauber! -1 entspräche der ip-addresse 255.255.255.255. deshalb gibt die funktion das ergebnis an einen zeiger. im fehlerfall ist der rückgabewert gleich 0.
EDIT:
deine funtion geht nicht, weil:char tmpstring[2];
müßte
char tmpstring[3];
lauten.
und du hast vergessen, die variable iplong mit 0 zu initialisieren (falls dein compiler das nicht schon automatisch macht).