struct hostent是否有一个字段“h_addr”?

时间:2012-07-10 02:29:08

标签: linux hostent

我遇到了以下代码快照:

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 个答案:

答案 0 :(得分:23)

你错过了这一点:

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

所以不,没有问题。

答案 1 :(得分:3)

他们说GNU's documentation page

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

他们还提供 h_addr ,它只是向量 h_addr_list 的第一个元素。

答案 2 :(得分:2)

h_addr不是POSIX。参见POSIX netdb.h。使用h_addr可能会导致error: ‘struct hostent’ has no member named ‘h_addr’。可移植代码应改为使用h_addr_list

答案 3 :(得分:1)

请注意,只有在包含头文件之前定义_BSD_SOURCE和/或_DEFAULT_SOURCE,某些系统上的OBJECT_NAME(f.referenced_object_id) = 'tblpatientmaster'宏才可见。