Linux网络编程C语言域名解析
head
end
/******* 域名解析 ************************** * 函数名:struct hostent *gethostbyname(const char *name); * 功能:域名解析 * 参数: * const char *name:域名或者ip * 返回值:struct hostent * * 成功:返回数据结构体 * 失败:NULL * ***************************************/ /********释放解析后的数据空间****************** * 函数名:void endhostent(void); * 功能:释放gethostbyname函数申请的空间 * 参数:无 * 返回值:无 * ****************************************/ #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> int main(int argc, char *argv[]) { if (argc != 3) { printf("参数错误:./程序名称 ip地址或者域名 端口号\n"); return 0; } for (int i = 0; i < argc; i++) { printf("参数[%d] = %s\n", i, argv[i]); } printf("打印解析数据:\n"); struct hostent *hs = gethostbyname(argv[1]); if (hs == NULL) { perror("获取失败:"); exit(0); } printf("主机正式名称:%s\n", hs->h_name); char *type_name = NULL; for (int i = 0; hs->h_aliases[i] != NULL; i++) { printf("别名[%d]列表:%s\n", i,hs->h_aliases[i]); } printf("址的长度:%d\n", hs->h_length); char *ip = NULL; //将网络大端字节序的ip转为字符点分形式 for (int i = 0; hs->h_addr_list[i] != NULL; i++) { ip = inet_ntoa(*(struct in_addr *)hs->h_addr_list[i]); printf("地址[%d]:%s\n", i, ip); } //输出ip地址 //释放我转换的数据信息 endhostent(); return 0; } // struct hostent //只支持IPv4 // { // char *h_name; /* 主机正式名称 */ // char **h_aliases; /* 别名列表 */ // int h_addrtype; /* 主机地址类型 */ // int h_length; /* 地址的长度 */ // char **h_addr_list; /* 地址列表 */ // } //#define h_addr h_addr_list[0] /* 为了向后兼容 */