给套接口上的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. windows的时间同步工具:w32time

    windows 客户端 官方文档自己排查可以看一下 如何在 Windows Server 中配置权威时间服务器 Windows Time Service Technical Reference Win ...

  2. 一次由于 MTU 设置不当导致的网络访问超时

    转自:http://weibo.com/ttarticle/p/show?id=2309404140904511340923 API 服务正常,但是调用总是超时.api端日志显示,响应速度很快. ​​ ...

  3. SQL第三节课

    常用函数 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数等. ABS(x) 返回x的绝对值 SELECT ABS(-1) -- 返回1 CEIL(x),CEILING(x) 返回大于或等于x ...

  4. php curl选项列表(超详细)

    第一类:对于下面的这些option的可选参数,value应该被设置一个bool类型的值:选项可选value值备注 CURLOPT_AUTOREFERER当根据Location:重定向时,自动设置hea ...

  5. Linux下进程与线程的区别

    https://www.cnblogs.com/fah936861121/articles/8043187.html https://my.oschina.net/cnyinlinux/blog/36 ...

  6. Linux思维导图之计划任务

    查漏补缺,理解概念,及时总结,互相交流,欢迎拍砖. 用yum install -y vixie-cron这个命令进行安装计划任务服务,可以在安装之前使用crontab -e进行检测一下,服务器是否安装 ...

  7. string.Format 格式化日期格式

    DateTime dt = DateTime.Now;//2010年10月4日 17点05分            string str = "";            //st ...

  8. SQL Server 2008 复制到MySQL

    SQLServer2008正在配放订阅的时候是能够看到收撑订阅办事器为Oracle或者DB2的,可是复制到MySQL没无间接的界面操做. 颠末测试,通过MySQL的ODBC驱动,是能够实现将SQLSe ...

  9. vim编辑强制执行命令

    vim进入文件,输入i编辑好文件,按esc,输入冒号,再输入底下代码 :w !sudo tee %

  10. Oracle中如何判断字符串是否全为数字

    Oracle中如何判断字符串是否全为数字 学习了:http://www.cnblogs.com/zrcoffee/archive/2012/12/11/2812744.html 本文介绍了判断字符串是 ...