21

我遇到了以下代码快照:

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”的字段,但代码确实可以编译,谁能告诉我为什么?谢谢。

4

4 回答 4

28

你错过了它下面的这一点:

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

所以不,没有问题。

于 2012-07-10T02:36:21.587 回答
3

GNU 的文档页面中,他们说

“回想一下,主机可能连接到多个网络并且每个网络都有不同的地址”

他们还提供了 a h_addr,它只是 vector 的第一个元素h_addr_list

于 2015-01-22T04:37:05.230 回答
2
于 2020-04-20T01:38:13.670 回答
1

请注意,h_addr宏在某些系统上仅在您定义 _BSD_SOURCE和/或_DEFAULT_SOURCE包含头文件之前可见。

于 2018-05-16T09:49:57.380 回答