Имеет ли структура 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 перед включением заголовочных файлов.

Другие вопросы по тегам