WinSock网络编程学习笔记(五):查询主机信息
来源:互联网 发布:java 加一个月 编辑:程序博客网 时间:2024/05/16 07:24
今天又学习了下winsock的知识,对知识做一下梳理。
1. 域名系统简介:Domain Name System(DNS)
其一个明显的作用是简化人们对IP的记忆方式,比如新浪的域名:www.sina.com,IP地址为“202,108,33,32”。
这IP地址多难记啊。
DNS空间是一个树形结构,树中的节点对应着一个资源集合,每个集合中包含一个或者多个资源记录,描述了与这个
节点名字相关的信息,其他主机可以通过查询操作得到指定资源集合中的具体信息。
1.1 解析器:
对于用户,接触最多的就是解析器,解析器是用户程序与域名服务器之间的接口程序,一般是库函数或系统调用。
当我们在收发邮件或者使用网页时都在使用解析器提供的服务,他把我们输入的名字转换为IP地址。实际上,
我们在地址栏输入“202,108,33,32”也可以访问新浪。
1.2 域名系统模型:
下图显示了应用程序、解析器、和名字服务器之间的典型关系:
主机查询程序 :
#include<stdlib.h>#include<stdio.h>#include<winsock2.h>#pragma comment(lib,"ws2_32")//注入要使用的库文件int main(int argc ,char *argv[]){char *name = NULL,**list_p;struct hostent *hostent_p;struct in_addr addr;WSADATA wsaData;WSAStartup(MAKEWORD(2,0),&wsaData);//winsock初始化if(argc == 2)//命令行输入的第二个参数是要解析的主机名或地址{name = argv[1];}if(name && isdigit(name[0]))//如果name[0]是数字,表示刚才输入的是IP地址{addr.s_addr = inet_addr(name);//地址转换函数,在上一篇中有代码实现if(addr.s_addr == INADDR_NONE)//输入的格式错误{printf("[%s] is invaild address\n",name);return -1;}hostent_p = gethostbyaddr((char *)&addr,sizeof(addr),AF_INET);}else //输入的不是数字,是字符串,表示输入的是主机名hostent_p = gethostbyname(name);//得到主机信息if(hostent_p == NULL){printf("fail to lookup,error:%d\n",WSAGetLastError());return -1;}printf("offical name :%s\n",hostent_p->h_name);//输出主机名称//如果主机还有别名,输出所有别名if(*hostent_p->h_aliases)printf("alias:\n");for(list_p = hostent_p->h_aliases;*list_p != NULL;list_p++){printf("\t%s\n",*list_p);}//根据地址类型(不同的地址类型如IPV4,IPV6,其他类型用unknown表示),将地址打印出来switch(hostent_p->h_addrtype){case AF_INET:printf("address type : AF_INET\n");break;case AF_INET6:printf("address type : AF_INET6\n");break;default:printf("address type is unknown\n");return -1;}printf("address:\n");for(list_p = hostent_p->h_addr_list;*list_p != NULL; list_p++){memcpy(&addr.S_un.S_addr,*list_p,hostent_p->h_length);//从list_p所指的内存地址拷贝hostent_p->h_length长的字节到&addr.S_un.S_addr(地址)printf("\t%s\n",inet_ntoa(addr));}WSACleanup();//释放资源return 0;}
运行结果:
0 0
- WinSock网络编程学习笔记(五):查询主机信息
- WinSock网络编程学习笔记
- WinSock网络编程学习笔记(六):服务查询程序(getserverbyname和getserverbyport函数)
- WinSock网络编程学习笔记(七):协议查询程序(getprotobyname和getprotobynumber函数)
- WinSock网络编程学习(三)判断主机字节序程序
- WinSock网络编程学习笔记(八):测试bind程序
- winsock编程(五)
- WinSock网络编程学习笔记(九):基于UDP实现DayTime协议
- Qt网络编程--主机信息
- java学习笔记(五)——网络编程
- Java网络编程学习笔记(五)客户端Socket
- 《UNIX网络编程 》学习笔记 (五)
- java学习笔记------java网络编程五
- Windows Socket 网络编程(五) —— 获取本地主机信息
- WinSock网络编程学习笔记(四)网络转换函数的实现
- Winsock编程笔记(1)
- windows编程学习--网络编程学习--winsock编程(1)
- Windows网络编程学习笔记(1) 编写一个Winsock基本框架
- 教你解决linux与r8168网卡不兼容导致网络时断时续的问题
- Jmeter JDBC请求的问题
- 比特币的三个视角
- 切勿暴饮暴食:春节
- 基于V4L2的视频驱动开发(2)
- WinSock网络编程学习笔记(五):查询主机信息
- js验证日期格式
- TMM软件测试成熟度模型
- 基于V4L2的视频驱动开发(3)
- asp.net 类自定义事件
- OOP技术
- Ubuntu下无法使用root登录Mysql的解决办法
- Undefined symbols for architecture i386或者armv7: “_OBJC_CLASS_$_XXX”
- ubuntu系统安装安卓模拟器(Android SDK)的方法