Does struct hostent have a field “h_addr”?
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.
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.