2012-07-10 8 views
12

ho incontrato il seguente codice snapshot:La struct hostent ha un campo "h_addr"?

struct hostent *hp; 
hp = my_gethostbyname(localhost); 
    if (hp == NULL) { 
     ls_syslog(LOG_ERR, I18N_FUNC_FAIL, fname, "my_gethostbyname()"); 
     return -1; 
    } 
    strcpy(localhost, hp->h_name); 

    memcpy(&addr, hp->h_addr, hp->h_length); 

Sono piuttosto confusa dall'ultima dichiarazione, la dichiarazione di struct hostent è come questo:

struct hostent { 
    char *h_name;  /* official name of host */ 
    char **h_aliases; /* alias list */ 
    int h_addrtype;  /* host address type */ 
    int h_length;  /* length of address */ 
    char **h_addr_list; /* list of addresses */ 
}; 

Non ha un campo denominato " h_addr ", ma il codice è stato compilato, qualcuno può dirmi perché? Grazie.

risposta

16

vi siete persi questo bit a destra sotto di essa:

#define h_addr h_addr_list[0] /* for backward compatibility */ 

Quindi no, non c'è nessun problema.

+1

Grazie ..... poco imbarazzato .... – wangshuaijie

2

Nel GNU's documentation page si dice

"Ricordiamo che l'host potrebbe essere collegato a più reti e hanno indirizzi diversi su ognuno di essi"

essi forniscono anche un h_addr, che è solo il primo elemento del vettore h_addr_list.

Problemi correlati