给套接口上的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. 自动装箱拆箱(Autoboxing,Unboxing)

    自动装箱和拆箱 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 1.5才有(Autoboxing,Unboxing) ...

  2. 爬虫系列(五) re的基本使用

    1.简介 究竟什么是正则表达式 (Regular Expression) 呢?可以用下面的一句话简单概括: 正则表达式是一组特殊的 字符序列,由一些事先定义好的字符以及这些字符的组合形成,常常用于 匹 ...

  3. 【ABCD组】Scrum meeting 2

    前言 第2次会议在6月14日由组长在教9 405召开. 主要对下一步的工作进行说明安排,时长90min. 主要内容 经会议讨论,由于一些对知识掌握的原因,决定放弃java语言实现系统,改用c#完成此系 ...

  4. JUnit单元测试实践:测试工具类和方法(EmptyUtils)

    以前的时候(读大学时),我认为写单元测试太费事了.现在,我改变看法了. 工作中,为了提高Web开发的质量和效率,近期又为了保证自己的工具类等一系列可复用组件的质量,我煞费苦心地开始认真学习和撰写单元测 ...

  5. JAVA的输入输出基本操作样例

    这些类的继承关系有些类似,弄一个作为样例,理解一下其中的机制. package cc.openhome; import java.io.*; public class Member { private ...

  6. 洛谷——P1507 NASA的食物计划

    https://www.luogu.org/problem/show?pid=1507#sub 题目背景 NASA(美国航空航天局)因为航天飞机的隔热瓦等其他安 全技术问题一直大伤脑筋,因此在各方压力 ...

  7. STL之rb_tree的find函数

    1 通用的search方法 STL在实现对特定key值的查找时,并没有採用通用的方法: BRTreeNode * rb_tree_search(RBTreeNode * x, int key){ wh ...

  8. POJ 1265

    主要利用PICK定理与边点数上的GCD的关系求解. 三角形一条边上的所有整数点(包括顶点)可以首先将这条边移到(0, 0)->(x, y).这时,(x/gcd(x, y), y/gcd(x, y ...

  9. hdu1209(Clock)

    pid=1209">点击打开hdu1209 Problem Description There is an analog clock with two hands: an hour h ...

  10. jsp页面自动换行

    其实只要在表格控制中添加一句 <div style="word-break:break-all">就搞定了.</div>其中可能对英文换行可能会分开一个单词 ...