给套接口上的I/O设置超时

1.调用alarm,在调用超过指定时间时产生SIGALARM信号,这涉及到信号处理,而且可能和进程中其他的alarm冲突
2.使用select阻塞在等待I/O上,select内部有时间限制,一次代替在read和write上阻塞超时
3.使用新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项,这种方法存在一个问题,即不是所有的系统都支持这两个选项。
这三种技术都可以用作输入和输出操作,但我们还想要一种支持connect超时的技术,因为TCP中的默认超时时间很长(75s),只有套接口为非阻塞方式时,才可以调用select为connect设置超时,connect并不支持SO_RCVTIMEO和SO_SNDTIMEO。前两种技术可以应用于任何描述符,第三种技术只能应用于套接字。
alarm的原理
alarm基于信号将中断阻塞的socekt操作,如果alarm产生信号之时connect仍未返回,EINTR错误即表示connect超时。
这种技术只能提前完成超时,而不能延长超时,比如connect的默认超时时长是75s,alarm可以提前为50s超时,却不能设置成80s超时。
用信号处理一个应答时没有问题,处理多个应答的时候就必须解决可能的冲突。
recv和send
recv和send的前三个参数和read、write相同,第四个参数由以下的一个或者多个flag或组成

MSG_DONTWAIT
将单个I/O操作设置为非阻塞,而不需要在套接口上设置非阻塞标记,执行I/O操作,然后关闭非阻塞。
MSG_WAITALL
告诉内核,没有读到请求的字节数之前不要返回,即使设定了这个标记,如果发生下列问题,返回的字节数仍然会比请求的要少
1.捕获一个信号
2.连接被终止
3.套接口上发生错误。
readv和writev
类似于read和write,但让我们可以在一个函数调用中操作多个缓冲区,这些操作被成为分散读和集中写。
readv和writev可用于任何描述字,而且writev是一个原子操作。
recvmsg和sendmsg
这两个函数是最通用的I/O函数,可以用recvmsg替代read、readv、recv、recvfrom,sendmsg也可以替代其他的write函数。
在不读出数据的时候,怎么知道套接口中有多少数据可读?
1.如果没有其他数据可读还有其他事情要做,可以使用非阻塞I/O。
2.如果想检查一下数据,而使数据扔保存在接收队列中,可以使用MSG_PEEK,如果想这么做,又不确定一定有数据可读,可以把MSG_PEEK和非阻塞套接口一起使用,或者和MSGDONTWAIT一起使用。
3.一些支持ioctl的FIONREAD命令,
标准I/O库用于套接口
对于任何文件描述符,调用fdopen可以返回一个标准I/O流,对于一个标准I/O流,调用fileno可以获得文件描述符。多路复用只能用于描述字,所以需要把标准I/O转为文件描述符。
TCP和UDP是全双工的,标准I/O流也可以是全双工的,只要以r+方式打开即可,但是对这样的流不能在一个输出函数后紧接着一个输入函数,必须插入一个fflush、fseek、fsetpos、或rewind调用,同样,不能在一个输入函数后紧接一个输出函数,必须插入一个fseek、fsetpos或rewind。除非输入函数遇到一个文件描述符,后三个函数的问题是他们都会调用lseek,可lseek会在套接口上失败。
解决这个问题的最简单方法是:为一个套接字打开两个标准I/O流,一个读、一个写。
问题是标准I/O库自动进行缓冲,标准I/O库执行三种缓冲
1.完全缓冲,意味着只有在以下情况才进行I/O:缓冲区满;进程调用fflush或者进程调用exit退出。标准I/O缓冲区大小通常为8192.
2.行缓冲:遇到一个换行符;进程调用fflush或者进程调用exit退出。
3.不缓冲,意味着每次调用标准I/O函数都进行I/O。
大部分UNIX的标准I/O遵循了以下原则
1.标准错误输出总是不缓冲
2。标准输入和标准输出是全缓冲的,除非它们是一个终端设备,那样它们是行缓冲的。
3.其他的流逗是全缓冲的,除非他们是一个终端设备,那样它们是行缓冲的。
套接口不是终端设备;有一些标准I/O库对大于255的文件描述符处理有问题。
事务TCP
在TCP基础上做了少量修改,以避免在最近通信过的主机之间进行三次握手(客户和服务器首次通信还是需要握手的,以后只要高速缓存的信息还没有过时就不需要握手)。
T/TCP把SYN、FIN和数据合并到单个分节中,前提是数据的长度小于MSS。T/TCP保持了TCP的可靠性。

高级I/O函数的更多相关文章

  1. makefile高级用法--使用函数

    makefile高级用法--使用函数 分类: C/C++ 使用函数 ———— 在Makefile中可以使用函数来处理变量,从而让我们的命令或是规则更为的灵活和具有智能.make所支持的函数也不算很多, ...

  2. Linux高性能server编程——高级I/O函数

     高级I/O函数 pipe函数 pipe函数用于创建一个管道,实现进程间的通信. #include <unistd.h> int pipe(int pipefd[2]); 通过pipe ...

  3. 第六章 高级I/O函数

    第六章 高级I/O函数 6.1 pipe函数 即管道函数,用于进程间的通信. #include<unistd.h> int pipe(int fd[2]); // fd:filedes / ...

  4. javascript 高级编程系列 - 函数

    一.函数创建 1. 函数声明 (出现在全局作用域,或局部作用域) function add (a, b) { return a + b; } function add(a, b) { return a ...

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

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

  6. linux高性能服务器编程 (六) --高级I/O函数

    第六章 高级I/O函数 Linux提供了很多高级的I/O函数,它不是基础的I/O函数(open/read) 1.创建文件描述符的函数比如:pipe.dup/dup2函数 2.读写数据的函数比如:rea ...

  7. 前端(十三)—— JavaScript高级:回调函数、闭包、循环绑定、面向对象、定时器

    回调函数.闭包.循环绑定.面向对象.定时器 一.函数高级 1.函数回调 // 回调函数 function callback(data) {} // 逻辑函数 function func(callbac ...

  8. 《Unix 网络编程》14:高级 I/O 函数

    高级 I/O 函数 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  9. UNP学习笔记(第十四章 高级I/O函数)

    本章讨论我们笼统地归为“高级I/O”的各个函数和技术 套接字超时 有3种方法在涉及套接字的I/O操作上设置超时 1.调用alarm,它在指定超时时期满时产生SIGALRM信号 2.在select中阻塞 ...

  10. 【HICP Gauss】数据库 数据库高级语法(数据类型函数)-3

    SQL高级语法:整型:   integer 2(-31) ~2(31)-1 4字节 intger unsigned 2(0)~2(32)-1 4字节 bigint 2(-63)~2(63)-1 8字节 ...

随机推荐

  1. 【剑指Offer】49、把字符串转换成整数

      题目描述:   将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数. 数值为0或者字 ...

  2. JS 常用语法

    通常,通过 JavaScript,您需要操作 HTML 元素. 1.通过 id 找到 HTML 元素 2.通过标签名找到 HTML 元素 3.通过类名找到 HTML 元素 提示:通过类名查找 HTML ...

  3. CSS max-width: 0;

    写CSS,大家都知道max-width是要在宽度超过后才会生效,但今天我发现一个神奇的现象, 为表格td加上max-width: 0;可以让上下两个表格自动对齐,这句的作用到底是什么还有待研究,今天先 ...

  4. http://www.phplo.com/special/2013/0616/467.html

    http://www.phplo.com/special/2013/0616/467.html

  5. 网上有一种错误的做法是:因为每一个双连通分量内的点low[]值都是相同的,则dfs()时,对于一条边(u,v),只需low[u]=min(low[u],low[v]),这样就不用缩点,最后求度数的时候

  6. Windows系统SNMP数据监测与OID

    Windows系统SNMP数据监测与OID http://blog.csdn.net/liuhuango123/article/details/52253953

  7. ZOJ 3527

    这题难在破环. 对于不是环的情况,只需按照一般的树形DP来做,一步一步往根递推就可以了.对于环,则枚举其中一点的两种情况,取或不取,然后再递推,就可以了.当到达某结点的下一结点为环开始的点时,退出即可 ...

  8. Cocos Code IDE里xcodeprojectlua脚本更新

    lua脚本改动后xcode须要clean又一次编译才干更新,这个是xcode里的老毛病了,网上有一些脚本但不是针对Cocos Code IDE的project文件夹的,这里列出 cocos2dx版本号 ...

  9. Android ScrollView中嵌套ListView

    由于要做一个相似美团的团购产品.scrollview中还有嵌入listview,要是直接把listview嵌进scrollview中.listview的高度是固定的不能进行滑动.默认情况下Androi ...

  10. 关于template 的23个问题

    发现新大陆.曾经慢慢才知道的东西.原来有个集中营: 看看updated, 处理方式是这么的好 35.1 " id="link-to-faq-35_1" style=&qu ...