热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

UNP总结Chapter12~14IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数

一、IPv4与IPv6的互操作性1.IPv4客户与IPv6服务器拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射

一、IPv4与IPv6的互操作性

1.IPv4客户与IPv6服务器

拥有双重协议栈的主机的一个基本特性就是:其上运行的IPv6服务器既能应付IPv4客户,又能应付IPv6客户。这是通过使用IPv4映射的IPv6地址实现的。

要求,ipv6服务器必须具有双重协议栈,即服务器必须同时拥有ipv4地址和ipv6地址,称其为ipv6服务器是因为开放的网络套接口为ipv6类型。

当ipv4客户欲连接ipv6服务器时,通过gethostbyname获得服务器主机的A记录(即ipv4地址),并通过网络发送ipv4数据包。ipv6服务器接受这个ipv4数据包,并通过内核将客户ipv4地址映射为ipv6地址返回。

 

2.IPv6客户与IPv4服务器

要求,ipv6客户必须具有双重协议栈。
因为即使服务器是双重协议的,客户能找到主机的AAAA记录(即ipv6地址),并发送ipv6数据包,但是由于ipv6地址不能转化成ipv4地址,所以ipv4服务器还是接受不了ipv6数据包。
所以,必须要求ipv6客户具有双重协议栈,这样在客户端上便能依靠解析器,在ipv6套接口上发送ipv4数据包了。

 

 

 

 

二、守护进程和inet超级服务器

1.概述

守护进程(daemon)是在后台运行不受终端控制的进程。Unix系统中一般有很多守护进程在后台运行(20到50个),执行不同的管理任务

 

2.syslogd守护进程和syslog函数

Unix系统中的syslogd守护进程通常由某个系统初始化脚本启动,而且在系统工作期间一直启动

既然守护进程没有控制终端,它们就不能把消息fprintf到stderr上,从守护进程中登记消息的常用技巧就是调用syslog函数

#include 

void syslog(int priority, const char * message, ... );

priority参数是级别(level)和设施(facility)的组合,举例来说,当调用rename函数失败时,守护进程可能会做以下调用:

syslog(LOG_INFO | LOG_LOCAL2, "rename(%s, %s): %m", file1, file2);

 


当应用程序第一次调用syslog时,它创建一个Unix域数据报套接口,然后调用connect连往syslogd守护进程建立的套机口的众所周知路径名(如 /var/run/log),这个套接口在进程终止前一直打开。另外,进程也可以调用openlog和closelog

#include 

void openlog(const char * ident, int options, int facility);void closelog(void);

ident是一个字符串,它将被syslog加到每条登记消息的前面,一般情况下它的值为程序名

 

3.daemon_init函数

调用它(通常从服务器程序)可使一个进程变成守护进程。

 

4.inetd守护进程

我们在网络编程时会发现,开始的几步都是基本一样的,对于服务器这一端,我们会使用socket, bind, listen ,accept 基本步骤相同,能不能把这几步形成一个总的,当有申请链接来时都调用一个进程链接,然后根据不同的申请fork子进程执行相应的程序呢?答案就是只用inetd守护进程。概括来说:inetd是监视一些网络请求的守护进程,其根据网络请求来调用相应的服务进程来处理连接请求

inetd守护进程是Unix/Linux自己的,他作为一个守护进程,处理请求,我们要做的是给他提供当对于某种链接,某个接口的请求时所要启动的程序就可以了。

一般说来, inetd 主要用于启动其它服务程序,但它也有能力直接处理某些简单的服务, 例如 chargen、 auth, 以及daytime。

 

 

 

 

三、高级I/O函数

1.套接字超时

涉及套接字上的I/O操作设置超时的方法有三种方法:

  • 调用alarm,在到达指定时间时产生SIGALRM信号
  • 使用select阻塞在等待I/O上,select内部有一个时间限制,以此代替在read或write调用上阻塞
  • 使用新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项

前两种技术可以用于任何描述字,而第三种只能用于套接口描述字。

 

2.recv和send函数

这两个函数和标准的read和write函数都类似,不过多了一个附加参数

#include 

sszie_t recv(
int sockfd, void * buff, size_t nbytes, int flags);
ssize_t send(
int sockfd, void * buff, size_t nbytes, int flags);
//返回: 成功返回读入或写出的字节数,出错返回-1

flag在设计上存在一个基本问题:它是按值传递的,而不是值-结果参数,因此它只能从进程向内核传递标志,内核不能向进程传递标志。flag参数取值详见UNP

 

3.readv和writev函数

由于在APUE专题有详解,所以这里仅给出函数原型

#include 

ssize_t readv(
int filedes, const struct iovec * iov, int iovcnt);
ssize_t writev(
int filedes, const struct iovec * iov, int iovcnt);
//返回: 读到或写出的字节数,出错时为-1

 

4.recvmsg和sendmsg函数

这两个函数是最通用的I/O函数,实际上,可以用recvmsg代替read, readv, recv, recvfrom. 类似的,各种输出函数可以用sendmsg取代。

#include 

ssize_t recvmsg(
int sockfd, struct msghdr * msg, int flags);
ssize_t sendmsg(
int sockfd, struct msghdr * msg, int flags);
//返回: 成功时为读入或写出的字节数,出错时为-1

两个函数把大部分参数都包装到一个msghdr结构中:

struct msghdr {
void *msg_name; /* protocol address */
socklen_t msg_namelen;
/* size of protocol address */
struct iovec *msg_iov; /* scatter/gather array */
int msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data (cmsghdr struct) */
socklen_t msg_controllen;
/* length of ancillary data */
int msg_flags; /* flags returned by recvmsg() */
};

下面给出recvmsg返回时的msghdr结构体实例:

 

 

5.辅助数据

辅助数据(ancillary data)可以通过sendmsg和recvmsg这两个函数,使用msghdr结构中的msg_contorl和msg_controllen成员发送和接收。辅助数据的另一种叫法是控制信息(control information)

辅助数据是一个或多个辅助数据对象组成,每个对象由一个cmsghdr结构开头,该结构在文件中定义如下:

struct cmsghdr {
socklen_t cmsg_len;
/* length in bytes, including this structure */
int cmsg_level; /* originating protocol */
int cmsg_type; /* protocol-specific type */
/* followed by unsigned char cmsg_data[] */
};

下图给出一个控制缓冲区中出出现两个辅助数据对象的例子:

下图为在Unix域套接字上的cmsghdr结构:

6.套接口和标准I/O

标准I/O库执行三种缓冲:(这个仍旧在APUE专题中仔细讨论过)

  • 完全缓冲意味着只有在以下情况时才进行I/O:缓冲区满,进程明确地调用fflush或进程调用exit终止。标准I/O缓冲区大小通常为8192字节。
  • 行缓冲意味着在以下情况时进行I/O:遇到一个换行符,进程调用fflush或进程调用exit终止。
  • 不缓冲意味着每次调用标准I/O输出函数时都进行I/O

 

7.高级轮询技术

1)./dev/poll接口

使用步骤:

  • 打开/dev/poll。
  • 初始化一个pollfd结构。
  • 调用write函数在/dev/poll设备上写这个结构数组一把它传递给内核。

打开/dev/poll,必须先初始化pollfd结构:

struct dvpoll {
struct pollfd* dp_fds;
int dp_nfds;
int dp_timeout;
};

 

2).kqueue接口

本接口允许进程向内核注册描述所关注的kqueue事件的事件过滤器

#include 

#include
event.h>

#include


int kqueue(void);

int kevent(int kq, const struct kevent *changelist, int nchanges, struct kevent *eventlist, int nevents,
const struct timespec *timeout) ;
void EV_SET(struct kevent *kev, uintptr_t ident, short filter, u_short flags, u_int fflags, intptr_t data, void *udata);

 

kevnt结构体:

struct kevent {
uintptr_t ident;
/* identifier (e.g., file descriptor) */
short filter; /* filter type (e.g., EVFILT_READ) */
u_short flags;
/* action flags (e.g., EV_ADD) */
u_int fflags;
/* filter-specific flags */
intptr_t data;
/* filter-specific data */
void *udata; /* opaque user data */
};

 

其中flags成员在调用时指定过滤器行为:

 

filter成员指定的过滤器类型:

 

 

 

 


推荐阅读
  • github:https:github.comfroghuiyolandaIO模型和多线程模型实现多线程设计的几个考虑在我们的设计中,mainre ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 题目描述输入整型数组和排序标识,对其元素按照升序或降序进行排序(一组测试用例可能会有多组数据)本题有多组输入,请使用whil ... [详细]
  • [ipsec][strongswan]strongswan源码分析(五)plugin的配置文件的添加方法与管理架构解析
    我们知道,strongswan是基于插件式管理的。不同的插件有不同的配置文件,在这下面,我们以netlink的插件为例:etcstrongswan.dcharonkernel-ne ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 如何提高PHP编程技能及推荐高级教程
    本文介绍了如何提高PHP编程技能的方法,推荐了一些高级教程。学习任何一种编程语言都需要长期的坚持和不懈的努力,本文提醒读者要有足够的耐心和时间投入。通过实践操作学习,可以更好地理解和掌握PHP语言的特异性,特别是单引号和双引号的用法。同时,本文也指出了只走马观花看整体而不深入学习的学习方式无法真正掌握这门语言,建议读者要从整体来考虑局部,培养大局观。最后,本文提醒读者完成一个像模像样的网站需要付出更多的努力和实践。 ... [详细]
  • 【STM32】定时器TIM触发ADC采样,DMA搬运到内存(超详细讲解)
    TIMADCDMA原理一般情况下,当我们需要进行采样的时候,需要用到ADC。例如:需要对某个信号进行定时采样(也就是隔一段 ... [详细]
  • PIMPL 是 C++ 中的一个编程技巧,意思为指向实现的指针。具体操作是把类的实现细节放到一个单独的类中,并用一个指针进行访问 ... [详细]
  •  很好的博客:https:blog.csdn.netqq_39809664articledetails79934516可持久化数组#include#inclu ... [详细]
  • 1,启动MySQL终端输入mysql-uroot-p然后输入密码,启动成功WelcometotheMySQLmonitor.Commandsendwith;or\g.YourMyS ... [详细]
  • Linux是一套免费使用和***传播的类UNIX操作系统,主要用于基于Intel x86系列CPU的计算机上。Linux系统是由全世界各地的成千上万的程序员合适的方式定制自己的Li ... [详细]
  • 102安装Linux系统
    安装Linux系统 安装CentOS系统准备系统光盘插入CentOS7光盘,引导安装程序设置主机,将光盘作为第一-引导设备从CentOS7光盘启动主机检测安装光盘的完整性从ISO镜 ... [详细]
  • Swoole是针对PHP的生产级异步编程框架。它是一种用纯C语言编写的PHP扩展,它使PHP开发人员能够在PHP中编写高性能,可扩展的并发TCP ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
author-avatar
爱电影麦兜兜
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有