我是靠谱客的博主 甜甜水杯,这篇文章主要介绍hostent h_addr_list,现在分享给大家,希望可以做个参考。

复制代码
1
2
3
4
5
6
7
8
struct hostent { char FAR * h_name; /* official name of host */ char FAR * FAR * h_aliases; /* alias list */ short h_addrtype; /* host address type */ short h_length; /* length of address */ char FAR * FAR * h_addr_list; /* list of addresses */ #define h_addr h_addr_list[0] /* address, for backward compat */ };

h_addr_list其实是一个指针数组,数组中每个元素都是in_addr型指针。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
typedef struct in_addr { union { struct { UCHAR s_b1,s_b2,s_b3,s_b4; } S_un_b; struct { USHORT s_w1,s_w2; } S_un_w; ULONG S_addr; } S_un; #define s_addr S_un.S_addr /* can be used for most tcp & ip code */ #define s_host S_un.S_un_b.s_b2 // host on imp #define s_net S_un.S_un_b.s_b1 // network #define s_imp S_un.S_un_w.s_w2 // imp #define s_impno S_un.S_un_b.s_b4 // imp # #define s_lh S_un.S_un_b.s_b3 // logical host } IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

因为hostent结构支持多种地址类型,所以其定义的h_addr_list是char **型。gethostbyname以后,实际存储情况是这样:

复制代码
1
2
3
4
hostent->h_addr_list[0][0] = 127 hostent->h_addr_list[0][1] = 0 hostent->h_addr_list[0][2] = 0 hostent->h_addr_list[0][3] = 1

得到的地址是网络字节顺序。转成正常的字符:

复制代码
1
2
3
char *ip; ip = inet_ntoa(*(struct in_addr *)*phost->h_addr_list);

向sockaddr_in赋值:

复制代码
1
2
3
4
5
struct sockaddr whereto; struct sockaddr_in *to; memset(&whereto, 0, sizeof(struct sockaddr)); to = (struct sockaddr_in *)&whereto; memcpy(&to->sin_addr, hp->h_addr, hp->h_length);


 

最后

以上就是甜甜水杯最近收集整理的关于hostent h_addr_list的全部内容,更多相关hostent内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部