通过远端域名获取主机信息

主机信息结构

struct hostent{
char * h_name; /* 主机的正式名称 */
char ** h_aliases; /* 主机别名列表*/
int h_addrtype;/* 主机地址类型 */
int h_length;/* 地址长度 */
char **h_addr_list; /* 地址列表,每个IP地址都实际上是以网络字节序表示的32比特整形数 */
}

/* 保持向后兼容 */
#define h_addr h_addr_list[0];


printf("%d\n",gethostbyname("www.baidu.com"));
struct hostent *host = gethostbyname("www.baidu.com");
// host = (struct hostent *)gethostbyname("www.baidu.com");
printf("%d,%s,%s,%s",host->h_addrtype,host->h_name,host->h_aliases[0],host->h_aliases[1],);

/* 2,www.a.shifen.com,www.baidu.com,pP□KpP□L60830480 */

通过域名获取远端主机IP地址

struct in_addr{
in_addr_t s_addr;//存放主机序的IP地址
}
// 继以上代码
struct in_addr asd;
asd.s_addr = ntohl((ulong)host->h_addr_list[0]);
printf("%x\n",asd.s_addr);

char* str = inet_ntoa(asd);
printf("%s",str);
/* 128.4.131.96 */
#define h_addr h_addr_list[0];
/*

host->h_addr 等效于 host->addr_list[0]; 所以host->h_addr的数据类型是char* 。

要使用inet_ntoa(struct in_addr addr)需要将host->h_addr 转换为struct in_addr * 类型 ,然后在*取值。


*/



struct hostent *host = gethostbyname("127.0.0.1");

printf("1 %d\n",host->h_addr);
printf("2 %s\n",inet_ntoa(*(struct in_addr*)(host->h_addr)));
printf("3 %s\n",host->h_addr);
printf("4 %d %d %d %d \n",host->h_addr[0],host->h_addr[1],host->h_addr[2],host->h_addr[3]);

/*
1 -2147187896
2 127.0.0.1
3
4 127 0 0 1
*/

inet_ntop的使用

其中第二个参数 void*buf参数是输入的 struct * in_addr类型或者 struct *s_addr类型都可以,最终结果一样。

/* 继以上代码 */
struct in_addr asd;
asd.s_addr = ntohl((ulong)host->h_addr_list[0]);
char det[32];
char det2[32];


char det[32];
char det2[32];
char det3[32];
char det4[32];

printf("ipv4- %s\n",inet_ntop(AF_INET,&asd,det,INET_ADDRSTRLEN));
printf("ipv4- %s\n",inet_ntop(AF_INET,&asd.s_addr,det2,INET_ADDRSTRLEN));
printf("ipv4- %s\n",inet_ntop(AF_INET,&(asd.s_addr),det3,INET_ADDRSTRLEN));
printf("ipv4- %s\n",inet_ntop(AF_INET,&((&asd)->s_addr),det4,INET_ADDRSTRLEN));

/* 打印结果都是 128.131.4.72 */

网络编程全套代码下载

网络编程全套代码下载2

网络编程全套代码下载3

网络编程全套代码