博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【linux高级程序设计】(第十五章)UDP网络编程应用 5
阅读量:5115 次
发布时间:2019-06-13

本文共 3006 字,大约阅读时间需要 10 分钟。

域名与IP信息解析

/etc/hosts 文件中有部分IP地址与域名主机名的信息

/etc/resolv.conf 里面有DNS服务器的IP地址

 

struct hostent{    char *h_name;   //主机的正式名字    char **h_aliases;  //主机备选名称,以NULL结尾的链表    int h_addrtype;     //返回地址的类型 有两种 AF_INET或 AF_INET6    int h_length;        //地址长度 以字节为单位    char **h_addr_list;  //主机网络地址,以NULL结尾的链表#define h_addr h_addr_list[0] };

通过域名返回主机信息

即通过www.baidu.com之类的域名得到相应的IP地址,别名之类的信息。

struct hostent *gethostbyname (__const char *__name) : 参数为主机域名

struct hostent *gethostbyname2 (__const char *__name, int __af) :参数2为地址协议类型

例子

#include
#include
#include
#include
#include
#include
#include
#include
#include
extern int h_errno;int main(int argc, char **argv){ int x, x2; struct hostent *hp; for(x = 1; x < argc; ++x) { //从参数读取域名,返回主机信息 hp = gethostbyname(argv[x]); if(!hp) { fprintf(stderr, "%s: host '%s'\n", hstrerror(h_errno), argv[x]); continue; } printf("Host %s :\n", argv[x]); printf("Officially:\t%s\n", hp->h_name); //官方名 fputs("Aliases:\t", stdout); for(x2 = 0; hp->h_aliases[x2]; ++x2) //其他名 { if(x2) fputs(", ", stdout); fputs(hp->h_aliases[x2], stdout); } fputc('\n', stdout); printf("Type:\t\t%s\n", hp->h_addrtype == AF_INET ? "AF_INET" : "AF_INET6"); //返回点分十进制IP地址 if(hp->h_addrtype == AF_INET) { for(x2 = 0; hp->h_addr_list[x2]; ++x2) printf("Address:\t%s\n", inet_ntoa(*(struct in_addr*)hp->h_addr_list[x2])); } putchar('\n'); } return 0;}

 

通过域名和IP返回主机信息

struct hostent *gethostbyaddr (__const void *__addr, __socklen_t __len, int __type)

参数1:主机的IP地址的网络字节顺序。需要强制转换为char*

参数2:地址长度,IP地址长度为4

参数3:地址类型(IP地址类型为AF_INET)

例子

#include
#include
#include
#include
#include
#include
#include
#include
#include
void main(int argc, const char **argv){ u_int addr; struct hostent *hp; char **p; if(argc != 2) { printf("usage: %s IP-address\n", argv[0]); exit(EXIT_FAILURE); } //点分十进制转换为32位网络字节顺序 if((int)(addr = inet_addr(argv[1])) == -1) { printf("IP-address must be of the form a.b.c.d\n"); exit(EXIT_FAILURE); } hp = gethostbyaddr((char *)&addr, sizeof(addr), AF_INET); //读取主机信息 if(hp == NULL) { printf("host information for %s no found\n", argv[1]); exit(EXIT_FAILURE); } for(p = hp->h_addr_list; *p != 0; p++) { struct in_addr in; char **q; memccpy(&in.s_addr, *p, sizeof(in.s_addr)); printf("%s\t%s", inet_ntoa(in), hp->h_name); for(q = hp->h_aliases; *q != 0; q++) printf("%s", *q); printf("\n"); } exit(EXIT_SUCCESS); }

如上:好多查不到的。

 

 

int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res)

协议无关,可适用于IPv4和IPv6

参数1:节点名,可以是主机名,也可以是二进制地址信息。IPV4为点分10进制,或是IPV6的16进制

参数2:十进制数的端口号或服务名,如ftp, http

参数3:调用者填写关于它想返回的信息类型。

参数4:存放返回addrinfo结构链表的指针地址信息。

 

void freeaddrinfo(struct addrinfo *ai)  :getaddrinfo函数的res是动态获取的,需要用该函数返回给系统

const char *gai_strerror(int error) :查询错误信息

转载于:https://www.cnblogs.com/dplearning/p/4710141.html

你可能感兴趣的文章
[常微分方程]Lecture 2: 欧拉数值方法及推广
查看>>
第九届全国大学生数学竞赛(江西赛区)数学类获奖学生名单
查看>>
《大型网站技术架构》读书笔记之七:随需应变之网站的可扩展架构
查看>>
剑指Offer面试题:28.连续子数组的最大和
查看>>
面向对象之继承
查看>>
一天一首现代诗
查看>>
利用React/anu编写一个弹出层
查看>>
飞信安装
查看>>
Bitmap 多语言实现及应用
查看>>
浏览器的加载顺序与页面性能优化
查看>>
树---数据结构
查看>>
ajax用get刷新页面元素在IE下无效解决~~
查看>>
[.NET] : 设定Windows Service启动类型
查看>>
Log4NET SQL配置
查看>>
Linux网络配置
查看>>
分享精心收藏的前台开发素材网站,都是干货
查看>>
Shell脚本修改Nginx upstream配置文件
查看>>
转_博弈论知识汇总
查看>>
进程的状态
查看>>
游戏外挂基本原理及实现
查看>>