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

本文主要是介绍IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/08/06/2625773.html

一、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成员指定的过滤器类型:

 

 

 


这篇关于IPv4与IPv6的互操作性、守护进程和inet超级服务器、高级I/O函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/337109

相关文章

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

MySQL常用字符串函数示例和场景介绍

《MySQL常用字符串函数示例和场景介绍》MySQL提供了丰富的字符串函数帮助我们高效地对字符串进行处理、转换和分析,本文我将全面且深入地介绍MySQL常用的字符串函数,并结合具体示例和场景,帮你熟练... 目录一、字符串函数概述1.1 字符串函数的作用1.2 字符串函数分类二、字符串长度与统计函数2.1

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

一文解密Python进行监控进程的黑科技

《一文解密Python进行监控进程的黑科技》在计算机系统管理和应用性能优化中,监控进程的CPU、内存和IO使用率是非常重要的任务,下面我们就来讲讲如何Python写一个简单使用的监控进程的工具吧... 目录准备工作监控CPU使用率监控内存使用率监控IO使用率小工具代码整合在计算机系统管理和应用性能优化中,监

postgresql使用UUID函数的方法

《postgresql使用UUID函数的方法》本文给大家介绍postgresql使用UUID函数的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录PostgreSQL有两种生成uuid的方法。可以先通过sql查看是否已安装扩展函数,和可以安装的扩展函数

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每