域名与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<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
extern int h_errno;
int main(int argc, char **argv)
{
int x, x2;
struct hostent *hp;
for(x = ; 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 = ; 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 = ; hp->h_addr_list[x2]; ++x2)
printf("Address:\t%s\n", inet_ntoa(*(struct in_addr*)hp->h_addr_list[x2]));
}
putchar('\n');
}
return ;
}

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

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

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

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

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

例子

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<arpa/inet.h>
#include<netdb.h>
void main(int argc, const char **argv)
{
u_int addr;
struct hostent *hp;
char **p;
if(argc != )
{
printf("usage: %s IP-address\n", argv[]);
exit(EXIT_FAILURE);
}
//点分十进制转换为32位网络字节顺序
if((int)(addr = inet_addr(argv[])) == -)
{
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[]);
exit(EXIT_FAILURE);
}
for(p = hp->h_addr_list; *p != ; 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 != ; 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) :查询错误信息

【linux高级程序设计】(第十五章)UDP网络编程应用 5的更多相关文章

  1. 读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

    读书笔记 - js高级程序设计 - 第十三章 事件   canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好   有时候即使浏览器支持,操作系统如果缺缺 ...

  2. JavaScript高级程序设计:第五章

    引用类型 一.object类型: 创建object实例的方式有两种.第一种是使用new操作符后跟Object构造函数,如下所示: var  person = new  Object(): person ...

  3. 《javascript高级程序设计》第五章 reference types

    第5 章 引用类型5.1 Object 类型5.2 Array 类型 5.2.1 检测数组 5.2.2 转换方法 5.2.3 栈方法 5.2.4 队列方法 5.2.5 重排序方法 5.2.6 操作方法 ...

  4. 【linux高级程序设计】(第九章)进程间通信-管道 1

    Linux操作系统所支持的主要进程间的通信机制. 无名管道 PIPE cat test.txt| grep hello 上面这种管道,将一个命令的输出作为另一个命令的输入,而这种管道是临时的,命令执行 ...

  5. linux高级管理第十二章--rsync

    实验部分 1.安装rsync 2.配置文件 3.配置密码 4.后续 5.为了测试,创建几个文件 配置实时同步 1.调整inotify内核参数 安装inotify-tools 测试同步 编写脚本 验证 ...

  6. 《JAVASCRIPT高级程序设计》第五章(2)

    一.Date类型 Date类型类型用于保存日期,有以下几种创建方式: //获取当前时间 var now = new Date(); //获取当前时间的毫秒数 var nowSecond = Date. ...

  7. 《JAVASCRIPT高级程序设计》第五章(1)

    引用类型是一种将数据和功能组合到一起的数据结构,它与类相似,但是是不同的概念:ECMAScript虽然是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和结构等基本结构.引用类型也被称为“对 ...

  8. Javascript高级程序设计笔记 <第五章> 引用类型

    一.object类型 创建object实例的方式有两种: //第一种使用new操作符跟构造函数 var person= new Object(); person.name="小王" ...

  9. Javascript高级程序设计复习——第五章引用类型 【原创】

    5.1  Object类型 1:创建Object实例的两种方式 ①new构造法 var obj1 = new Object(); 注意大写!不传递参数时可以省略圆括号 obj1.hehe = &quo ...

  10. Linux高级运维 第五章 Vim编辑器和恢复ext4下误删除的文件-Xmanager工具

    5.1  vim主要模式介绍,vim命令模式. 确保系统已经安装了VIM工具 [root@panda ~]# rpm -qf `which vim` [root@panda ~]# rpm -qf ` ...

随机推荐

  1. build dynamic libraries for iOS and load them at runtime

    编译了libmt.dylib, 和 test 程序调用,均正常.在xcode中显示调用正常,隐式调用则出现问题. 提示 dyld: Library not loaded. 即使存在在/usr/lib/ ...

  2. Spark-Streaming 常用流式计算算子

    UpdateStateByKey 使用说明:维护key的状态. 使用注意:使用该算子需要设置checkpoint 使用示例: object UpdateStateByKeyTest { def mai ...

  3. 程序员必看:如何降低APP软件开发的成本?

    程序员必看:如何降低APP软件开发的成本? 作为一名曾经的程序猿,一直想写一点东西给大家分享一下,今天终于动笔了,写写我们在开发的过程中怎样才能更快更好的进行开发,降低app开发成本.无论是个人开发者 ...

  4. 《数据结构》C++代码 堆(优先队列)

    堆,是优先队列最常用的一种实现方式.在优先队列中,每个元素都被赋予了一个优先级,而每次出队时都让优先级最高的元素出队.堆,则是一种存储优先队列的方法,特指以一棵树形式存储的优先队列.最常用的是二叉堆, ...

  5. mysql一机多实例安装记录

    因为想研究mycat,所以需要安装多个mysql实例进行研究.限于没有多于计算机,只能在本机安装了.通过mysql文档,自己琢磨着安装成功! 目录结构如下: 其中one和two文件夹用来模拟数据库分库 ...

  6. linux部署环境配置

    https://blog.csdn.net/dsczxcc/article/details/78728330

  7. 求 n的阶乘

    def chengji(n): if n == 0: return 1 return chengji(n-1)*nprint(chengji(n))

  8. 孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数

    孤荷凌寒自学python第四十九天继续研究跨不同类型数据库的通用数据表操作函数 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天继续建构自感觉用起来顺手些的自定义模块和类的代码. 不同类型 ...

  9. cloud-utils

    官方下载:https://launchpad.net/cloud-utils rpm包下载地址:http://rpmfind.net/linux/rpm2html/search.php?query=c ...

  10. SQLEXPRESS 2012 安装NorthWind和Pub数据库

    安装SQL后,学习时总是没有这两个示例数据库. 先从微软那里下载此文件. 网址:http://www.microsoft.com/en-us/download/details.aspx?id=2365 ...