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、可以在处理过程中临时挂接信号掩码
阅读全文
0 0
- socket编程(六)
- C++ Socket(六)
- Linux Socket学习(六)
- socket编程原理(六)
- Linux Socket学习(六)
- socket的创建(六)
- socket的创建(六)
- socket的创建(六)
- C语言(六)
- Unix C (六)
- C练习(六)
- 《Effective C++》(六)
- C三道题(六)
- Chrome源代码分析之socket(六)
- MFC(六)——Socket编程
- io-nio-socket步步为营(六)SSL
- C语言库函数(六)
- C核心技术手册(六)
- ng2-webstorm-snippets
- HttpServletRequestWrapper和jsp:param之间的问题及XSS防御
- LintCode-----17.带重复元素的子集
- mongodb实现类似sql中distinct的效果
- Android 下面调起键盘后的样式兼容性问题
- C++ Socket(六)
- OGG Configuring DDL Support
- 算法笔记:编辑距离
- 正则表达式获取url参数
- 用map对list进行分组
- JSP的3个编译指令、7个动作指令、9个内置对象
- 弹出ALV的几种方法(ALV POPUP)
- ios 内购
- 利用jquery的imgAreaSelect插件实现图片裁剪示例