Имеет ли структура hostent поле "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);
Последнее заявление меня смущает, объявление struct hostent выглядит так:
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 */
};
В нем нет поля с именем "h_addr", но код может компилироваться, кто-нибудь может сказать мне, почему? Благодарю.
3 ответа
Вы пропустили этот бит прямо под ним:
#define h_addr h_addr_list[0] /* for backward compatibility */
Так что нет, нет проблем.
На странице документации GNU они говорят
"Напомним, что хост может быть подключен к нескольким сетям и иметь разные адреса в каждой"
они также обеспечивают h_addr
который является только первым элементом вектора h_addr_list
,
h_addr
не является POSIX. См. POSIX netdb.h. С помощьюh_addr
может привести к error: ‘struct hostent’ has no member named ‘h_addr’
. Переносимый код должен использоватьh_addr_list
вместо.
Обратите внимание, что h_addr
макрос в некоторых системах виден только если вы определите _BSD_SOURCE
и / или _DEFAULT_SOURCE
перед включением заголовочных файлов.