15.3    网络信息

当眼下为止,客户和server程序一直是吧地址和port号编译到它们自己的内部。

对于一个更通用的server和客户程序来说。能够通过网络信息函数来决定应该使用的地址和port。

假设有足够的权限,能够将自己的服务加入到/etc/services文件里的已知服务列表中。并在这个文件里为port号分配一个名字,使用户能够使用符号化的服务名而不是port号的数字。

类似地。假设给定一个计算机的名字。能够通过调用解析地址的主机数据库函数来确定它的IP地址。这些函数通过查询网络配置文件来完毕这一工作,如/etc/hosts文件或网络信息服务。

经常使用的网络信息服务有NIS(Network Information Service。网络信息服务)和DNS(Domain Name Service,域名服务)。

主机数据库函数在接口头文件netdb.h中声明。例如以下所看到的:

  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; /* name of the host */
  3. char **h_aliases; /* list of aliases (nicknames) */
  4. int h_addrtype; /* address type */
  5. int h_length; /* length in bytes of the address */
  6. char **h_addr_list; /* list of address (network order) */
  7. };

假设没有与查询的主机或地址相关的数据项,这些信息函数将返回一个空指针。

类似地,与服务及其关联port号有关的信息也能够通过一些服务信息函数来获取。例如以下所看到的:

  1. #include <netdb.h>
  2. struct servent *getservbyname(const char *name, const char *proto);
  3. struct servent *getservbyport(int port, const char *proto);

proto參数指定用于连接服务的协议,它的两个取值是tcp和udp。前者用于SOCK_STREAM类型的TCP连接,后者用于SOCK_DGRAM类型的UDP数据报。

结构servent至少包括下面几个成员:

  1. struct servent {
  2. char *s_name; /* name of the service */
  3. char **s_aliases; /* list of aliases (alternative names) */
  4. int s_port; /* The IP port number */
  5. char *s_proto; /* The service type, usually "tcp" or "udp" */
  6. };

假设想要获得某台计算机的主机数据库信息。能够调用gethostbyname函数而且将结果打印出来。注意,要把返回的地址列表转换为正确的地址类型,并用函数inet_ntoa将它们从网络字节序转换为打印的字符串。函数inet_ntoa的定义例如以下所看到的:

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

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

它在失败时返回-1。

其它可用的新函数还有gethostname,它的定义例如以下所看到的:

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

这个函数的作用是,将当前主机的名字写入name指向的字符串中。主机名将以null结尾。參数namelength指定了字符串的长度,假设返回的主机名太长,它就会被截断。

gethostname在成功时返回0,失败时返回-1.

以下这个程序getname.c用来获取一台主机的有关信息。

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <netdb.h>
  5. #include <netinet/in.h>
  6. #include <arpa/inet.h>
  7.  
  8. int main(int agrc, char *argv[])
  9. {
  10. char *host, **name, **addrs;
  11. struct hostent *hostinfo;
  12.  
  13. if (argc == 1) {
  14. char myname[256];
  15. gethostname(myname, 255);
  16. host = myname;
  17. }
  18. else
  19. host = argv[1];
  20. hostinfo = gethostbyname(host);
  21. if (hostinfo) {
  22. fprintf(stderr, "cannot get info for host: %s\n", host);
  23. exit(1);
  24. }
  25.  
  26. printf("results for host %s:\n", host);
  27. printf("Name: %s\n", hostinfo->h_name);
  28. printf("Aliases:");
  29. name = hostinfo->h_aliases;
  30. while (*names) {
  31. printf(" %s", *names);
  32. names++;
  33. }
  34. printf("\n");
  35.  
  36. if (hostinfo->h_addrtype != AF_INET) {
  37. fprintf(stderr, "not an IP host!\n");
  38. exit(1);
  39. }
  40.  
  41. addrs = hostinfo->h_addr_list;
  42. while (*addrs) {
  43. printf(" %s", inet_ntoa(*(struct in_addr *)*addrs));
  44. addrs++;
  45. }
  46. printf("\n");
  47. exit(0);
  48. }

此外。能够用gethostbyaddr函数来查出哪个主机拥有给定的IP地址。能够在server上用这个函数来查找连接客户的来源。

程序解析

getname程序通过调用gethostbyname从主机数据库中提取出主机的信息。它打印出主机名、它的别名和该主机在它的网络接口上使用的IP地址。

执行这个程序并指定主机名google时,程序给出了以太网和解调器两个网络接口的信息,当使用主机名localhost时,程序仅仅给出了回路网络的信息,例如以下所看到的:



1

linux程序设计——网络信息(第十五章)的更多相关文章

  1. 【linux高级程序设计】(第十五章)UDP网络编程应用 5

    域名与IP信息解析 /etc/hosts 文件中有部分IP地址与域名主机名的信息 /etc/resolv.conf 里面有DNS服务器的IP地址 struct hostent { char *h_na ...

  2. 【linux高级程序设计】(第十五章)UDP网络编程应用 2

    UDP广播通信 单播:一对一,TCP和UDP均可完成 广播:只能UDP完成.广播时发送方只发送一个数据包,但是网络上的交换机默认转发广播数据包到所有端口.路由器默认不转发任何广播数据包.故广播在局域网 ...

  3. 【linux高级程序设计】(第十五章)UDP网络编程应用 1

    UDP网络通信流程 UDP没有connect的过程,故发送数据时需要指明目的地址,不能使用read/write/send/recv. 采用sendto()和recvfrom() ssize_t sen ...

  4. 【linux高级程序设计】(第十五章)UDP网络编程应用 4

    socket信号驱动 为了使一个套接字能够使用信号驱动I/O,至少需要以下3步操作. 1.安装SIGIO信号 2.套接字的拥有者设定为当前进程.因为SIGIO信号只会送到socket拥有者进程. 通过 ...

  5. 【linux高级程序设计】(第十五章)UDP网络编程应用 3

    UDP组播通信 组播IP地址: D类IP地址  1110.**********  224.0.0.1 ~ 239.255.255.255 组播MAC地址:低23位,直接对应IP地址, 从右数第24位为 ...

  6. 《Linux Device Drivers》第十五章 内存映射和DMA——note

    简单介绍 很多类型的驱动程序编程都须要了解一些虚拟内存子系统怎样工作的知识 当遇到更为复杂.性能要求更为苛刻的子系统时,本章所讨论的内容迟早都要用到 本章的内容分成三个部分 讲述mmap系统调用的实现 ...

  7. JavaScript高级程序设计学习笔记第十五章--使用Canvas绘图

    一.基本用法 1.要使用<canvas>元素,必须先设置其 width 和 height 属性,指定可以绘图的区域大小.能通过 CSS 为该元素添加样式,如果不添加任何样式或者不绘制任何图 ...

  8. linux程序设计——多线程(第十二章)

    12.8    多线程 之前,总是让程序的主线程只创建一个线程.这节将演示怎样在同一个程序中创建多个线程,然后怎样以不同于其启动顺序将它们合并在一起.此外,还演示多线程编程时easy出现的时序问题. ...

  9. 《Linux命令行与shell脚本编程大全》 第十五章 学习笔记

    第十五章:控制脚本 处理信号 重温Linux信号 信号 名称 描述 1 HUP 挂起 2 INT 中断 3 QUIT 结束运行 9 KILL 无条件终止 11 SEGV 段错误 15 TERM 尽可能 ...

随机推荐

  1. JavaScript-性能优化,函数节流(throttle)与函数去抖(debounce)

    我在写一个类似百度搜索框的自动提示功能时候,使用了AJAX+keydown事件.调试时候我发现,当在搜索框中输入文字的时候,控制台在不停发送AJAX.这在本地服务器测试还好,如果我把它拿到运行环境,很 ...

  2. 键盘事件keydown、keypress、keyup

    事件触发顺序:keydown - > keypress - > keyup   中文输入法:   firfox:输入触发keydown,回车确认输入触发keyup chrome:输入触发k ...

  3. LVS高可用集群的配置

    网络结构: LVS DR工作原理 LVS集群从客户端上看可以将整个集群看成单个服务器对外提供服务,其IP是集群内部的VIP(虚拟IP).从内部看,转发服务器(DS)其实并没有启动应用层的服务对接口进行 ...

  4. MySQL 手动主从同步不锁表

    有时候MySQL主从同步不一致比较严重的时候,需要手动同步. 然而网上看大很多需要锁表的同步的方法基本如下 1.先对主库锁表 FLUSH TABLES WITH READ LOCK; 2.备份数据 m ...

  5. JMeter 中Random 随机函数的使用

    场景:在做接口测试时,比如说要求用户的手机号码不允许重复,那此时可以通过Random 随机函数来解决此问题: 1.在JMeter 工具中,选择{选项-函数助手对话框-} 函数助手中选择 Random ...

  6. Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色

    Xamarin XAML语言教程Xamarin.Forms中改变活动指示器颜色 在图12.10~12.12中我们会看到在各个平台下活动指示器的颜色是不一样的.Android的活动指示器默认是深粉色的: ...

  7. NULL和唯一约束UNIQUE的对应关系

    NULL和唯一约束UNIQUE的对应关系   在数据库中,NULL表示列值为空.唯一约束UNIQUE规定指定列的值必须是唯一的,值和值之间都不能相同.这个时候,就出现一个问题,NULL和NULL算是相 ...

  8. TCO 2015 Round 2A DIV1

    ModModMod 傻逼数论 题意: 这是一道卖萌的题..给你一个取模序列$m$,令$f(x)=(\cdots (x\ mod\ m[0])\ mod m[1])\mod m[2]\cdots $,问 ...

  9. php 技术知识点汇总

    consul : 服务发现 做服务发现的框架常用的有 zookeeper eureka etcd consul zookeeper,  php中的libzookeeper PHP使用 swagger ...

  10. 跳转移动端js代码

    <script language="JavaScript"> $(function(){ var MobileUA = (function() { var ua = n ...