inet_ntoa
-
[code="c"]
const char * inet_ntoa(struct in_addr in) {
static char b[18];
register char *p = (char *)∈#define UC(b) (((int)b)&0xff)
snprintf(b, sizeof(b),"%d.%d.%d.%d", UC(p[0]), UC(p[1]), UC(p[2]),UC(p[3]));
return (b);
}
[code]Hallo habe diesen Code gefunden inet_ntoa ist ja nicht Thread sicher und unter windows habe ich kein inet_ntop egal hab mir schon eine Thread sichere Funktion gebastelt
meine Frage : Wieso benutzt man als Index 18 bei char b[18] die maximale Größe eines Oktets(IPv4) ist aller höhstens 3 stellig. Jedes Oktett kommt 4 mal vor dazwischen immer ein Punkt (xxx.xxx.xxx.xxx) ergibt 15 Zeichen + '0' für die Stringterminierung ergibt bei mir 16 Zeichen. Somit würde doch ein
static char b[15] vollkommen ausreichen oder ?
-
const char * inet_ntoa(struct in_addr in) { static char b[18]; register char *p = (char *)∈ #define UC(b) (((int)b)&0xff) snprintf(b, sizeof(b),"%d.%d.%d.%d", UC(p[0]), UC(p[1]), UC(p[2]),UC(p[3])); return (b); }
-
also wo ich den Quellcode her hab das sind schon Profis hier mal der Link hab den code nur bishen verändert
http://www.opensource.apple.com/source/Libc/Libc-186/net.subproj/inet_ntoa.c
-
Könntet ihr auch mal über meine Thread sichere Funktion drübergugen ?
const char* inet_ntoa2(struct in_addr in,char *buffer,size_t size) { register unsigned char *p = (unsigned char *)∈ if( size < 15 || p == NULL ) return NULL; snprintf(buffer, size, "%d.%d.%d.%d", p[0], p[1], p[2], p[3] ); return buffer; }
Danke
-
sry meinte man braucht nur static char b[16] und auch in der Funktion muss size < 16 stehen
-
Bei CHAR_BIT == 8 und struct-Elemente alle von *char-Typ würde das tatsächlich reichen.
- register raus
- kein Cast: greife direkt auf die struct (unsigned char)-Elemente gemäß deiner in_addr-Implementierung zu
- snprintf ist erst C99
- Rückgabewert von snprintf/sprintf prüfen
- ...