C++ Socket(六)

来源:互联网 发布:apache服务器 ubuntu 编辑:程序博客网 时间:2024/06/07 01:44

1、主要的IO模式

IO模式是指从socket中读写数据(特别是读)的方式,常见的IO模式有

1.1 阻塞IO模型

当用户进程调用读取函数(如recvmsg())时,内核将阻塞用户进程直至有足够数据达到读取函数才返回。

1.2 非阻塞IO模型

当用户进程调用读取函数(如recvmsg())时,内核立即返回数据(没有数据的话就返回错误信息)给用户进程(即读取函数将立即返回)。

这样的模型需要用户程序反复尝试多次(一般使用轮询)才能读到数据,非常浪费CUP资源,所以非阻塞IO模型用的不多。

1.3 IO复用模型

基于阻塞方式,但可以同时等待多个socket(即复用),当一个或者多个socket状态有变化(或者超时)时从阻塞状态返回,转而处理获取的IO数据。

1.4 信号驱动IO模型

前面1.1~1.3都是以同步的方式处理IO。信号驱动IO模型则提供异步的方式处理IO。
在用户进程一开始就注册监听特定信号。当IO准备就绪之后内核会发出这个信号,此时用户进程便可以以异步的方式处理读取IO。

1.5 异步IO模型

与1.4类似,不同的地方是,1.4是在IO准备就绪(有足够数据达到)时内核发送信号,而1.5是在用户进程完成数据读取后内核发送信号。


socket默认是阻塞方式的(无论是连接接入如accept还是数据读取recvmsg),可以通过fcntl函数实现对socket的控制使其变为非阻塞方式或者信号驱动方式。

2、IO复用模型应用

2.1 select/pselect

在调用读取函数(如recvmsg())之前可以先调用select/pselect函数对socket集合执行查询。这样就可以保证所操作的socket集合符合操作条件。


2.1 poll/ppoll

2.1.1 poll

#include<poll.h>int poll (struct pollfd *__fds, nfds_t __nfds, int __timeout);
参数含义如下:
__fds:指向pollfd数组的指针,pollfd数据结构里存放一个需要监视的socket和对应的监视条件
__nfds:需要监视的socket最大数目+1
__timeout:超时时间,单位是ms,负值表示永远等待
返回值:大于0,成功,返回值为满足某些监视条件的socket数目;0超时;-1错误,错误代码如下:


/* Data structure describing a polling request.  */struct pollfd  {    int fd;/* File descriptor to poll.  */    short int events;/* Types of events poller cares about.  */    short int revents;/* Types of events that actually occurred.  */  };
成员数据含义如下:
fd:监视的socket
events:输入的监视事件
revents:输出的监视事件
events/revents值和含义如下


2.1.2 ppoll

与poll相比,有如下不同
1、超时时间单位是纳秒
2、可以在处理过程中临时挂接信号掩码







原创粉丝点击