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。

最新文章

  1. script async 和script defer的区别
  2. 领域驱动设计系列 (六):CQRS
  3. Quartz.NET开源作业调度框架系列(二):CronTrigger
  4. SSH协议及其应用
  5. select into from 提示 Undeclared variable.....错误的解决办法 && select into from 和 insert into select 的用法和区别
  6. Oracle 临时表
  7. SVN四部曲之SVN使用详解进阶
  8. JavaSE学习总结第21天_IO流3
  9. 查看apache,mysql,nginx,php的编译参数
  10. 读书笔记_MVC__关于通过js构建ORM,实现Model层
  11. Java中HashMap底层实现原理(JDK1.8)源码分析
  12. 【译】.NET 跨平台界面框架和为什么你首先要考虑再三
  13. Dynamic Clock in Terminal.
  14. 论文速读(Yongchao Xu——【2018】TextField_Learning A Deep Direction Field for Irregular Scene Text)
  15. Python - 使用Pylint检查分析代码
  16. Mark 韦氏拼音 邮政式拼音 和汉语拼音
  17. CS231n: Convolutional Neural Networks for Visual Recognition
  18. Android短信收发(二)
  19. Android开发中的神坑和知识点记录
  20. Elasticsearch 2.4.1 Bigdesk 插件安装

热门文章

  1. Arduino可穿戴教程之第一个程序——上传运行程序(四)
  2. HDU 3790最短路径问题 [最短路最小花费]
  3. 【BZOJ 2656】2656: [Zjoi2012]数列(sequence) (高精度)
  4. [NC13A]反蝴蝶效应/[SPOJ-NPC2014D]General Joke
  5. [POJ1205]Water Treatment Plants
  6. hdu 1171 多重背包
  7. bzoj1634护花
  8. hihocoder 1522 : F1 Score
  9. undefined null 各种值比较(面试题)
  10. Visual SVN 企业版代码管理平台的建设