UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数
一、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 <syslog.h> 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 <syslog.h> 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 <sys/socket.h> 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 <sys/uio.h> 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 <sys/socket.h> 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结构开头,该结构在<sys/socket.h>文件中定义如下:
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 <sys/types.h> #include <sys/event.h> #include <sys/time.h> 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成员指定的过滤器类型:
UNP总结 Chapter 12~14 IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数的更多相关文章
- Unix网络编程学习笔记之第12章 IPv4与IPv6的互操作性
一. 简单介绍 如果我们本章讨论的主机都是支持双栈的,即支持IPv4地址.也支持Ipv6地址. 我们本次讨论的点:client与server端使用的是不同类型的地址.由于同样类型的地址没什么可讲的. ...
- Gradle 1.12翻译——第十九章. Gradle 守护进程
有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...
- UNP学习笔记(第十三章 守护进程和inetd超级服务器)
关于守护进程可以查看apue的笔记 http://www.cnblogs.com/runnyu/p/4645046.html daemon_init函数 下面给出名为daemon_init函数,通过调 ...
- UNP学习第13章 守护进程和inetd超级服务器
Unix系统中的syslogd守护进程通常由某个系统初始化脚本启动,而且在系统工作期间一直运行. 源自Berkeley的syslogd实现在启动时执行以下步骤. (1)读取配置文件.通常为/etc/s ...
- 从内核3.7版本开始,Linux就开始支持VXLAN 到了内核3.12版本,Linux对VXLAN的支持已经完备,支持单播和组播,IPv4和IPv6。
一.关于VXLAN VXLAN 是 Virtual eXtensible LANs 的缩写,它是对 VLAN 的一个扩展,是非常新的一个 tunnel 技术,在Open vSwitch中应用也非常多. ...
- RFC2474 - Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers的双语版
RFC2474 - Definition of the Differentiated Services Field (DS Field) in the IPv4 and IPv6 Headers英文版 ...
- IP地址(IPv4)/IPv6地址的正则表达式
原地址:http://pfeishao.blog.163.com/blog/static/18162337020112113130453/ Pv4地址正则表达式:^((25[0-5]|2[0-4]\d ...
- IPv6下网络编程socket, TCP和UDP例子,以及兼容IPV4和IPV6的类
一.TCP socket ipv6与ipv4的区别 服务器端源代码如下: #include <stdio.h> #include <stdlib.h> #include < ...
- UNP总结 Chapter 11 名字与地址转换
本章讲述在名字和数值地址间进行转换的函数:gethostbyname和gethostbyaddr在主机名字与IP地址间进行转换,getservbyname和getservbyport在服务器名字和端口 ...
随机推荐
- AngularJS的ng-class示例
程序下载:https://files.cnblogs.com/files/xiandedanteng/angularJSRender.rar 代码: <!DOCTYPE HTML PUBLIC ...
- hql 时间
1.hql中时间格式转换 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String d ...
- Odoo10尝鲜:MRP 10 新概念
OEE [ overall equipment Effectiveness 整体设备效率 ] 整體設備效率是整合稼働率 (Availability).產能效率 (Performance).良率 (Qu ...
- windows ffmpeg 推送摄像头数据到rtmp服务
文本主要讲述windows系统下如何利用ffmpeg获取摄像机流并推送到rtmp服务,命令的用法前文 中有讲到过,这次是通过代码来实现.实现该项功能的基本流程如下: 图1 ffmpeg推流流程图 较前 ...
- Struts2使用POI创建Excel并下载
本文将讲解在Struts2框架下如何使用POI创建Office Excel文档并实现下载功能. Apache POI ,操作微软文档的Java API,简单来说就是可以用来操作Office文档的API ...
- 热烈庆祝UE4完全免费Free---GitHub的关联方式
热烈庆祝UE4完全免费Free---GitHub的关联方式 时间:2015-03-03 18:38:52 阅读:3007 评论:0 收藏:0 [点我收藏+] 标 ...
- Apache/Nigix + Tomcat + 负载均衡
Part I: Apache + Tomcat + 负载均衡 http://www.open-open.com/lib/view/open1350612892352.html http://micha ...
- erlang防止反编译
前面提到了erlang的反编译,下面说下防止反编译: 1)建立~/.erlang.crypt 在编译的用户名的home目录中建立一个加密方法的文件.erlang.crypt,内容如下: [{debug ...
- Apache/2.4.9启动错误:AH01630: client denied by server configuration
在升级Yii框架1.11->2.0beta时,PHP升级到5.5.顺带升级Apache2.2.x到2.4.9. 把原有vhost配置移植过来,出现Apache启动错误: AH01630: cli ...
- 更改UISearchBar button属性
//点击搜索框时触发 - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { self.theSearchUserSearchBa ...