http://blog.163.com/tyw_andy/blog/static/1167902120099163252164/

套接口缺省是阻塞的。这一点意味着当发出一个不能立即完成的套接口调用时,其进程将被投入睡眠,等待相应操作完成。可能阻塞的套接口调用可分为一下四类。

1   输入操作:包括read, readv, recv,
recvfrom和recvmsg共5个函数。如果某个进程对一个阻塞的TCP套接口调用这些输入函数之一,而且该套接口的接收缓冲区中没有数据可读,该
进程将被投入睡眠,知道达到一些数据。因为TCP是字节流协议,该进程的唤醒就是只要达到一些数据:这些数据既可以是单个字节,也可以是一个完整的TCP
分节中的数据。如果想等到某个固定数目的数据可读为止,那么可以调用readn函数或者指定MSG_WAITALL标志。因为UDP是数据报协议,如果一
个阻塞的UDP套接口的接收缓冲区为空,对它调用输入函数的进程将被投入睡眠,知道达到一个UDP数据报。
对于非阻塞套接口,如果输入操作不能被满足,相应调用将立即返回一个EWOULDBLOCK错误。

2    输出操作:包括write, writev, send,
sendto和sendmsg共5个函数。对于一个TCP套接口,内核将从应用进程的缓冲区到该套接口的发送缓冲区拷贝数据。对于阻塞的套接口,如果其发
送缓冲区中没有空间,进程将被投入睡眠,直到有空间为止。
对于非阻塞的TCP套接口,如果其发送缓冲区中根本没有空间,输出函数调用将立即返回一个EWOULDBLOCK错误。如果其发送缓冲区中有一些空间,返回值将是内核能够拷贝到该缓冲区中的字节数。这个字节数也成为short count。
UDP套接口不存在真正的发送缓冲区。内核只是拷贝应用进程数据并把它沿协议栈向下传输,渐次冠以UDP头部和IP头部。因此对一个阻塞的UDP套接口(缺省设置)输出函数调用将不会因与TCP套接口一样的原因而阻塞,不过有可能会因为其他的原因而阻塞。

3    接受外来连接:即accept函数。如果对一个阻塞的套接口调用accept函数,并且尚无新的连接到达,调用进程将被投入睡眠。
如果对一个非阻塞的套接口调用accept函数,并且尚无新的连接到达,accept调用将立即返回一个EWOULDBLOCK错误。

4   
发起外出连接,即用于TCP的connect函数(该函数同样可以用于UDP不过不能导致建立一个真正的连接,只是导致内核保存对端的IP地址和端口
号)TCP连接的建立涉及一个三路握手过程,而且connect函数一直要等到客户收到对于自己的SYN的ACK为止才返回。这一点意味着TCP的每个
connect总是阻塞其调用进程至少一个到服务器的RTT时间。
如果对一个非阻塞的TCP套接口调用connect,并且连接不能立即建立,那么连接的建立照样发起(譬如送出TCP三路握手的第一个分组),不过返回一
个EINPROGRESS错误,该错误不同于上述三个情形中返回的错误。另注意有些连接可以立即建立,通常发生在服务器和客户端处于同一个主机的情况下。
因此即使对于一个非阻塞的connect我们也得预备connect成功返回的情况发生。

当在一个非阻塞的TCP套接口上调用connect时,connect将立即返回一个EINPROGRESS错误,不过已经发起的TCP三路握手继续进行。我们接着使用select检测这个连接或成功或失败的已建立条件,非阻塞的connect有三个用途
    1    我们可以把三路握手迭合在恰处理上,完成一个connect要花费一个RTT时间上的几秒。这段时间内也许有我们想要执行的其他处理工作可以执行。

2    我们可以使用这个技术同时建立多个连接。这个用途已随着Web浏览器变得流行起来。
    3   
既然使用select等待连接的建立,我们可以给select指定一个时间限制,使得我们能够缩短connect的超时。许多实现有一个从75秒钟到数分
钟的connect超时。应用程序有时需要一个更短的超时,实现办法之一就是使用非阻塞connect。

非阻塞I/O的更多相关文章

  1. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  2. 非阻塞/异步(epoll) openssl

    前段时间在自己的异步网络框架handy中添加openssl的支持,当时在网络上搜索了半天也没有找到很好的例子,后来自己慢慢的摸索,耗费不少时间,终于搞定.因此把相关的资料整理一下,并给出简单的例子,让 ...

  3. 同步与异步 & 阻塞与非阻塞

    在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 一.同步 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用 ...

  4. 网络IO之阻塞、非阻塞、同步、异步总结

    网络IO之阻塞.非阻塞.同步.异步总结 1.前言 在网络编程中,阻塞.非阻塞.同步.异步经常被提到.unix网络编程第一卷第六章专门讨论五种不同的IO模型,Stevens讲的非常详细,我记得去年看第一 ...

  5. (转)NIO与AIO,同步/异步,阻塞/非阻塞

    原文地址: http://www.cnblogs.com/enjoy-ourselves/p/3793771.html 1.flip(),compact(),与clear()的使用 flip()内部实 ...

  6. Linux下的串口编程及非阻塞模式

    本篇介绍了如何在linux系统下向串口发送数据.包括read的阻塞和非阻塞.以及select方法. 打开串口 在Linux系统下,打开串口是通过使用标准的文件打开函数操作的. #include < ...

  7. python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步

    1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...

  8. tornado 异步调用系统命令和非阻塞线程池

    项目中异步调用 ping 和 nmap 实现对目标 ip 和所在网关的探测 Subprocess.STREAM 不用担心进程返回数据过大造成的死锁, Subprocess.PIPE 会有这个问题. i ...

  9. JS进阶之非阻塞

    回调函数,阻塞和非阻塞对于初学者来说总是一些不好理解的东西,最好的办法就是通过实际写代码去体会.笔者今天就通过一个例子来简单解释一下JS的非阻塞,分享分享我的理解. 首先回调函数:这是一个异步过程,简 ...

  10. NIO与AIO,同步/异步,阻塞/非阻塞

    1.flip(),compact(),与clear()的使用 flip()内部实现,先将limit设为当前位置,再将缓冲区的postion设为0,所以是为将缓冲区的数据写出到其它通道或者get()作准 ...

随机推荐

  1. WebApi使用JWT认证(二)

    这是第二部:实现NetCore上的WebApi使用JWT认证 1.NetCore新建一个WebApi的项目 2.打开AppSettings.json,添加Jwt的信息,这里为了演示而已 { " ...

  2. openstack首页默认跳转

    在/var/www/html新建index.html <html> <head> <meta http-equiv="Content-Language" ...

  3. 【BZOJ 4171】 4171: Rhl的游戏 (高斯消元)

    4171: Rhl的游戏 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 74  Solved: 33[Submit][Status][Discuss] ...

  4. [BZOJ4444][SCOI2015]国旗计划(倍增)

    链上是经典贪心问题,将线段全按左端点排序后把点全撒在线段右端点上.这里放到环上,倍长即可. 题目保证不存在区间包含情况,于是有一种暴力做法,先将战士的管辖区间按左端点从小到大排序,对于询问x,从x战士 ...

  5. [BZOJ4539][HNOI2016]树(主席树)

    4539: [Hnoi2016]树 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 746  Solved: 292[Submit][Status][D ...

  6. bzoj 1004 Cards 组合计数

    这道题考察的是组合计数(用Burnside,当然也可以认为是Polya的变形,毕竟Polya是Burnside推导出来的). 这一类问题的本质是计算置换群(A,P)中不动点个数!(所谓不动点,是一个二 ...

  7. c# -- 介绍File.AppendAllText 方法

    下面介绍两个函数: File.AppendAllText (String, String) File.AppendAllText (String, String, String) File.Appen ...

  8. ThinkPHP -- 去除URL中的index.php

    原路径是 http://localhost/test/index.php/index/add 想获得的地址是 http://localhost/test/index/add 那么如何去掉index.p ...

  9. PHP -- 模拟测试上传文件

    FROM :http://web.itivy.com/article-740-1.html QQ上传文件为什么那么快? “QQ上传大文件/QQ群发送大文件时,可以在极短的时间内完成”是如何做到的. 有 ...

  10. [转]java中Collections.sort排序详解

      Comparator是个接口,可重写compare()及equals()这两个方法,用于比价功能:如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e, ...