一 主机数据库函数

  1. #include <netdb.h>
  2. struct hostent *gethostbyaddr(const void *addr,      //地址
                      size_t len,          //长度
                      int type           //类型
                     );
  3. struct hostent *gethostbyname(const char *name);

  这些函数返回的结构中至少包含以下几个成员

  1. struct hostent{
  2. char *h_name;          //主机名称
  3. char **h_aliases;        //别名列表
  4. int h_addrtype;         //地址类型
  5. int h_length;          //地址长度
  6. char **h_addr_list;      //地址列表
  7. };

  如果想获得某台计算机的主机数据库信息,可以调用gethostbyname函数并且将结果打印出来,注意,要把返回的地址列表转换为正确的地址类型,并用函数inet_ntoa将它们从网络字节序转换为可打印的字符串

  1. #include <arpa/inet.h>
  2. char *inet_ntoa(struct in_addr in);

函数作用:将一个因特网主机地址转换为一个点分四元组格式的字符串

  1. #include <unistd.h>
  2. int gethostname(char *name,int namelength);

函数作用:将当前主机的名字写入name指向的字符串中。主机名为null结尾。参数namelength指定了字符串name的长度,如果返回的主机名太长,它就会被截断

例子:

  1. #include <stdio.h>
  2. #include <arpa/inet.h>
  3. #include <stdlib.h>
  4. #include <netdb.h>
  5. #include <netinet/in.h>
  6.  
  7. int main(int argc,char *argv[]){
  8. char *host,**names,**addrs;
  9. struct hostent *hostinfo;
  10. //把host变量设置为getname程序所提供的命令行参数,或默认设置为用户主机的主机名
  11. if(argc==){
  12. char myname[];
  13. gethostname(myname,);
  14. host=myname;
  15. }else{
  16. host=argv[];
  17. }
  18. //调用gethostbyname,如果未找到相应的信息就报告一条错误
  19. hostinfo=gethostbyname(host);
  20. if(!hostinfo){
  21. sprintf(stderr,"Cannot get info for host:%s\n",host);
  22. exit();
  23. }
  24. //显示主机名和它可能有的所有别名
  25. printf("result for host:%s\n",host);
  26. printf("Name:%s\n",hostinfo->h_name);
  27. printf("Aliases:");
  28. names=hostinfo->h_aliases;
  29. while(*names){
  30. printf("%s",*names);
  31. names++;
  32. }
  33. printf("\n");
  34. if(hostinfo->h_addrtype!=AF_INET){
  35. fprintf(stderr,"not an IP host!\n");
  36. exit();
  37. }
  38. addrs=hostinfo->h_addr_list;
  39. while(*addrs){
  40. printf("%s",inet_ntoa(*(struct in_addr*)*addrs));
  41. addrs++;
  42. }
  43. printf("\n");
  44. exit();
  45. }

二 服务信息函数

  1. #include <netdb.h>
  2. struct servent *getservbyname(const char *name,        //服务名称
                      const char *proto        //指定用于连接该服务的协议,它的取值是tcp(用于SOCK_SREAM类型的TCP连接)和udp(用于SOCK_DGRAM类型的UPD数据报)
                     );
  3. struct servent *getservbyport(int port,             //端口号
                      const char *proto
                     );

结构servent至少包含一下几个成员

  1. struct servent{
  2. char *s_name;        //服务名称
  3. char **s_aliases;      //别名列表
  4. int s_port;         //IP端口号
  5. char *s_proto;       //服务类型
  6. };

例子:

  1. #include <sys/socket.h>
  2. #include <netinet/in.h>
  3. #include <netdb.h>
  4. #include <stdio.h>
  5. #include <unistd.h>
  6. #include <stdlib.h>
  7.  
  8. int main(int argc,char *argv[]){
  9. char *host;
  10. int sockfd;
  11. int len,result;
  12. struct sockaddr_in address;
  13. struct hostent *hostinfo;
  14. struct servent *servinfo;
  15. char buffer[];
  16.  
  17. if(argc==){
  18. host="localhost";
  19. }else{
  20. host=argv[];
  21. }
  22. //查找主机的地址,如果找不到,就报告一条错误
  23. hostinfo=gethostbyname(host);
  24. if(!hostinfo){
  25. fprintf(stderr,"no host:%s\n",host);
  26. exit();
  27. }
  28. //检查主机上是否有daytime服务
  29. servinfo=getservbyname("daytime","tcp");
  30. if(!servinfo){
  31. fprintf(stderr,"no daytime service\n");
  32. exit();
  33. }
  34. printf("daytime port is %d\n",ntohs(servinfo->s_port));
  35. //创建一个套接字
  36. sockfd=socket(AF_INET,SOCK_STREAM,);
  37. //构造connect调用要使用的地址
  38. address.sin_family=AF_INET;
  39. address.sin_port=servinfo->s_port;
  40. address.sin_addr=*(struct in_addr*)*hostinfo->h_addr_list;
  41. len=sizeof(address);
  42. //然后建立连接并取得有关信息
  43. result=connect(sockfd,(struct sockaddr *)&address,len);
  44. if(result==-){
  45. perror("oops:getdate");
  46. exit();
  47. }
  48. result=read(sockfd,buffer,sizeof(buffer));
  49. buffer[result]='\0';
  50. printf("read %d bytes:%s",result,buffer);
  51. close(sockfd);
  52. exit();
  53. }

Linux学习笔记31——网络信息的更多相关文章

  1. kali linux学习笔记(四) : 网络端口大全介绍

    端口大全介绍 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发 ...

  2. python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息,抓取政府网新闻内容

    python3.4学习笔记(十三) 网络爬虫实例代码,使用pyspider抓取多牛投资吧里面的文章信息PySpider:一个国人编写的强大的网络爬虫系统并带有强大的WebUI,采用Python语言编写 ...

  3. Linux 学习笔记

    Linux学习笔记 请切换web视图查看,表格比较大,方法:视图>>web板式视图 博客园不能粘贴图片吗 http://wenku.baidu.com/view/bda1c3067fd53 ...

  4. linux学习笔记2-linux的常用命令

    第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装linux操作系统,以及一些基本的设置修改. 本篇博客主要介绍linux中的一些常用的终端命令 ======== ...

  5. Linux学习笔记-林耐斯Notes-Linux就该这么学

    Linux学习笔记... 参考的优秀Linux网站: http://www.w3cschool.cn/linux/ http://www.linuxeye.com/ http://linux.vbir ...

  6. deepin linux学习笔记

    目录 deepin linux学习笔记 前言 linux常用命令 ls 显示文件夹内容 cd 切换当前目录 pwd 查看当前工作目录 mkdir 新建文件夹 rm 删除文件或文件夹 mv 移动文件 c ...

  7. linux学习笔记2 - linux常用命令

    转载请标注原链接:http://www.cnblogs.com/xczyd/p/5543731.html 第一篇博客:linux学习笔记1-ubuntu的安装与基本设置 之中,已经介绍了如何安装lin ...

  8. Linux 学习笔记之超详细基础linux命令(the end)

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 14---------------- ...

  9. Linux 学习笔记之超详细基础linux命令 Part 14

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 13---------------- ...

随机推荐

  1. Nginx的反向代理

    先通过简单的图来说明一下正向代理和反向代理吧~ 正向代理 代理其实就是一个中介,A和B本来可以直连,中间插入一个C,C就是中介.刚开始的时候,代理多数是帮助内网client访问外网server用的(比 ...

  2. P1417 烹调方案

    P1417 烹调方案 题目提供者tinylic 标签 动态规划 难度 普及+/提高 题目背景 由于你的帮助,火星只遭受了最小的损失.但gw懒得重建家园了,就造了一艘飞船飞向遥远的earth星.不过飞船 ...

  3. VS2010修改默认配置路径

    视图->属性管理器 弹出如下截图:

  4. GitHub Windows客户端部署

    下载网址:https://windows.github.com 点击下载按钮即可下载一个小程序,这个小程序会去服务器端下载完整的Windows版客户端,然后自动安装. 如果安装出错的话,那就打开IE浏 ...

  5. SQL的经典操作——批量复制同行的其它列数据到其它列数据

    看图说话比较直观: 对比复制前后的数据表: 使用SQL语句:UPDATE OR ROLLBACK Content SET YINBIAO = YINBIAO2, GESHU = GESHU2 WHER ...

  6. 基于ACE的定时器模板类

    ACETimerClockGenerator.h ClockGeneratorIF.h 在类中定义一个结构体,在结构体中定义一个函数. 在结构体中定义一个函数,这样做有什么好呢? TimerHandl ...

  7. AJAX原理及优缺点

    1.ajax技术的背景 不可否认,ajax技术的流行得益于google的大力推广,正是由于google earth.google suggest以及gmail等对ajax技术的广泛应用,催生了ajax ...

  8. 四层运维工具nc

        nc命令全名为netcat,顾名思义就是通过TCP或UDP从网络读写数据. 很多事情不一定非得抓包,nc也能发挥巨大作用. 1.传输文件 使用<>重定向符(只适用单文件,不推荐.失 ...

  9. notepad++使用技巧

    1.将tab设置为插入4个空格而不是tab字符 1)点击设置-->首选项 2)选中转换为空格.点击蓝色数字,可以设置制表符宽度 2.对已有文档,进行tab和空格的相互转换 选中编辑-->空 ...

  10. ceph入门学习链接

    https://tobegit3hub1.gitbooks.io/ceph_from_scratch/content/introduction/component.html