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
    - ...


Anmelden zum Antworten