15.3    网络信息

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

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

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

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

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

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

#include <netdb.h>
struct hostent *gethostbyaddr(const void *addr, size_t len, int type);
struct hostent *gethostbyname(const char *name);

这些函数返回的结构中至少会包括下面几个成员:

struct hostent {
char *h_name; /* name of the host */
char **h_aliases; /* list of aliases (nicknames) */
int h_addrtype; /* address type */
int h_length; /* length in bytes of the address */
char **h_addr_list; /* list of address (network order) */
};

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

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

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

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

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

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

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

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

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

它在失败时返回-1。

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

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

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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h> int main(int agrc, char *argv[])
{
char *host, **name, **addrs;
struct hostent *hostinfo; if (argc == 1) {
char myname[256];
gethostname(myname, 255);
host = myname;
}
else
host = argv[1];
hostinfo = gethostbyname(host);
if (hostinfo) {
fprintf(stderr, "cannot get info for host: %s\n", host);
exit(1);
} printf("results for host %s:\n", host);
printf("Name: %s\n", hostinfo->h_name);
printf("Aliases:");
name = hostinfo->h_aliases;
while (*names) {
printf(" %s", *names);
names++;
}
printf("\n"); if (hostinfo->h_addrtype != AF_INET) {
fprintf(stderr, "not an IP host!\n");
exit(1);
} addrs = hostinfo->h_addr_list;
while (*addrs) {
printf(" %s", inet_ntoa(*(struct in_addr *)*addrs));
addrs++;
}
printf("\n");
exit(0);
}

此外。能够用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. Spring Boot学习——Spring Boot简介

    最近工作中需要使用到Spring Boot,但是以前工作中没有用到过Spring Boot,所以需要学习下Spring Boot.本系列笔记是笔者学习Spring Boot的笔记,有错误和不足之处,请 ...

  2. 某考试T1 game

    题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n− ...

  3. Ruby 定时任务之一(初步尝试)

    最近工作需要用到定时任务.原来写java的时候也用到过类似的Scheduler的功能. Ruby语言中也有同样功能的工具.rufus-scheduler.下面介绍一下rufus-scheduler. ...

  4. Java使用HttpURLConnection调用WebService(原始方法)

    说明:使用Java原生的HttpURLConnection调用WebService可以免去引入SOA的框架,比如一些CXF框架等.可以使代码足够精简,比如对于一些只调用一两个接口的,这种方式是最适合的 ...

  5. Sort Detail Data Block Example - Oracle Forms

    Example is given below to sort detail data block data (toggle asc or desc) with push buttons used as ...

  6. 快速销售订单 - OM:销售订单表单:级联行题头更改

    PROFILE OM:销售订单表单:级联行题头更改

  7. Object-C 类

    Classes 类 像其它的面向对象的语言一样,Object-C也提供创建对象的蓝本.即类. 首先我们在类中定义一些能够反复使用的属性和方法. 然后,我们实例化类,即对象,之后就能够使用属性和訪问. ...

  8. Linux系统内核性能调优

    做过Linux平台性能测试的童鞋平时可能会遇到如下问题: 1. TCP端口号不够用导致并发上不去(即与服务器端建立新连接失败) 2. TIME_WAIT状态连接过多导致应用服务器(Nginx.Hapr ...

  9. struts2获取ServletContext对象

      CreateTime--2017年9月7日09:24:40 Author:Marydon struts2获取ServletContext对象 需要导入: import javax.servlet. ...

  10. Spket安装

    1.http://www.spket.com/下载1.6.23放到Eclipse或者myEclipse的dropins文件夹下 2. 3. 4. 我的是jquery-1.8.2.js,2.1.1不会提 ...