今天在要获取主机IP地址时,大概步骤记得是调用gethostname() 和gethostbyname(),但是当用gethostbyname得到hostent这个结构的一个指针时,却不知道该咋办了。忘了这个结构都有哪些成员了。失败
struct hostent
{
char *h_name; //主机的正式名称
char **h_aliases; //主机的别名,一个主机可以有多个别名
所以用了字符串指针。
int h_addrtype; //主机地址类型一般为2表示是AF_INET
int h_length; //地址长度,32位地址长度为4个字节
char **h_addr_list; //存储主机地址的数组。此处要注意的是该成员可以存储多个IP地址,即如其名称所言,地址列表。当获取到hostent结构指针后,要读取地址信息。应该使用
强制转换为in_addr*再使用。我刚开始使用的时候以为每个h_addr_list[i]就是一个地址列表的字符,结果得到的不是自己想要的。
#define h_addr h_addr_list[0] //为向后兼容
};
而上面的in_addr结构,在写代码的时候很少使用到,in_addr其实就是一个32位的网络字节序地址。
下面是一个测试代码,麻雀虽小,五脏俱全,还是能够实现获取主机IP的功能的:
struct in_addr { union { struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { u_short s_w1,s_w2; } S_un_w; u_long S_addr; } S_un;//该联合结构使对结构访问方便.多种方式访问结构. };
下面是一个列子代码: