Frage

I encountered the following code snapshot:

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);

I am rather confused by the last statement, the declaration of struct hostent is like this:

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 */
};

It doesn't have a field named "h_addr", but the code did can compile, can anyone tell me why? thanks.

War es hilfreich?

Lösung

You missed this bit right under it:

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

So no, there is no problem.

Andere Tipps

In the GNU's documentation page they says

"Recall that the host might be connected to multiple networks and have different addresses on each one"

they also provide a h_addr which is just the first element of the vector h_addr_list.

h_addr is not POSIX. See POSIX netdb.h. Using h_addr could result in error: ‘struct hostent’ has no member named ‘h_addr’. Portable code should use h_addr_list instead.

Note that the h_addr macro is on some systems only visible if you define _BSD_SOURCE and/or _DEFAULT_SOURCE before including header files.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top