阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到来.这个行为叫阻塞.accept()方法将会阻塞服务器线程直到一个呼叫到来.当5个连接处理完闭之后,服务器退出.任何的在队列中的呼叫将会被取消.
  非阻塞:非阻塞套接字是指执行此套接字的网络调用时,不管是否执行成功,都立即返回。比如调用recv()函数读取网络缓冲区中数据,不管是否读到数据都立即返回,而不会一直挂在此函数调用上。在实际Windows网络通信软件开发中,异步非阻塞套接字是用的最多的。平常所说的C/S(客户端/服务器)结构的软件就是异步非阻塞模式的。 
   
  具体机制就是上面所说的,简明扼要的来说可以打个比方:
  你有数个同学来访 <---> 有若干数据需要收取
  你时不时的去门口看看,没有看到你同学的话就回客厅等待,看到同学就接到客厅来 <---> 非阻塞模式,无论收到数据与否都返回
  你一直在门口等着你同学,接到后才回客厅 <---> 阻塞模式,接收到数据后才返回
 
  使用阻塞怎么了?会带来什么后果?在什么情况之下?对性能有影响么?
套接字有两种模式,阻塞模式与非阻塞模式。默认创建的为阻塞模式.
在blocking model 下:
套接字在IO时阻塞应用程序,就是说控制权不会返回给应用程序,也就是说程序执行到此代码时会卡住。分两种情况,1.send函数时,只有把要发送的数据下传至TCP层,send这句代码才继续向下执行,此时可确认自己的数据已经在网络上传输了2.recv时,只有收到一定数据给应用程序缓冲区时,recv这行代码才会向下执行。如果不想这样做,可以使用多线程,或者选用其他网络IO模型。一般在做服务器程序时,不会使用阻塞套接字,性能低,数据吞吐率也不高。优点是此种模型编写难度较低,可以用来做入门的学习之用。
非阻塞套接字,IO会马上返回.但在send时,如果SOCKET缓冲区已满,会返回错误,使用WSAGetLastError会得到错误码为WSAEWOULDBLOCK,意思是说在一个非阻塞的套接字上,请求没有完成。recv时如果SOCKET缓冲区没有可以读的数据,也会返回WSAEWOULDBLOCK.
 
  Socket 的模式大概分为这么几种:
1、阻塞式的,Socket操作都需要将线程挂起,等待内核完成后才能返回。
如: 调用connect=>进入内核=>Syn包=〉服务器返回SYN ACK 包=〉connect返回。
=〉ACK包发往服务器。
但一般来说,阻塞和非阻塞对于recv来说意义更大。
当在阻塞式的Socket上调用recv时,如果这时网络栈上没有数据给你接收,那么这时线程将
会挂起,直到有报文给你接收才返回。
这样就造成你的应用程序在企图接收数据时候,而网络栈上没有数据的时候就会被锁住。
有什么办法解决这个问题呢? 我们来介绍IO
2、 IO复用, 就是在企图读写数据的时候先询问下是否可读写,如果不能,可以去干别的事情,不会造成死锁。
但是假如我们有大量的连接需要去频繁的查询可读写状态,每次查询都会和内核交互。这样会造成
效率低下。再介绍一种
3、 重叠IO. 就是一次查询多个Socket的状态。不用去来来回回的遍历。
另外,
在windows socket api 中还有一种消息机制,就是把Socket状态通知到窗口。然后用消息去处理。
对于重叠IO, 在windows上还有完成端口模型,他和重叠端口相比,不但能捕捉到IO事件, 而且内核已经替你完成了Socket IO, 比如read事件, 在内核通知你的时候,他已经帮你读好数据了,并放在你指定的缓存中(这里是指在用户态下,事先为每个Socket分配的内存)。
为什么有这么多socket模式呢? 哪个更好呢?
为什么有,我不知道,可能是出于需求吧,
说说哪个更好?
孤立的来说,其实没有哪个更好? 只有哪个更适合你的应用应用环境。
如: 阻塞式的比较简单,方便,稳定。适合比较简单的客户端程序。
IO复用我认为它适合SocketIO操作比较少的情况。
重叠IO就适合高性能的服务器的开发,另外完成端口是windows上比较公认的高性能服务器的网络开发模型。当然, windows 的IOCP也有个坏处,就是需要大量的内存,应为前面说了他需要事先指定缓存。不过高性能的 服务器,一般都不用windows平台。
windows的消息模型就比较适合有UI的应用程序。
当然, 有些模型的选择上可能还有个人爱好的因素,
如, 我可能不喜欢用消息模型,
我不喜欢被动的被通知, 而喜欢主动的去查询。

[转]Socket编程中,阻塞与非阻塞的区别的更多相关文章

  1. Socket编程中,阻塞与非阻塞的区别

    阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket.如果在队列中没有请示将会出现什么情况呢?那个方法将会等待一个的到 ...

  2. socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别?

    一.举个打电话的例子: 阻塞   block   是指,你拨通某人的电话,但是此人不在,于是你拿着电话等他回来,其间不能再用电话.同步大概和阻塞差不多. 非阻塞   nonblock   是指,你拨通 ...

  3. socket编程的同步、异步与阻塞、非阻塞示例详解

     socket编程的同步.异步与阻塞.非阻塞示例详解之一  分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...

  4. UNIX网络编程——关于socket阻塞与非阻塞情况下的recv、send、read、write返回值

    1.阻塞模式与非阻塞模式下recv的返回值各代表什么意思?有没有 区别?(就我目前了解阻塞与非阻塞recv返回值没有区分,都是 <0:出错,=0:连接关闭,>0接收到数据大小,特别:返回 ...

  5. socket阻塞与非阻塞,同步与异步、I/O模型,select与poll、epoll比较

    1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步/异步主要针对C端: 同步:      所谓同步,就 ...

  6. socket阻塞与非阻塞,同步与异步

    socket阻塞与非阻塞,同步与异步 作者:huangguisu 转自:http://blog.csdn.net/hguisu/article/details/7453390 1. 概念理解 在进行网 ...

  7. IO中同步、异步与阻塞、非阻塞的区别

    一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回. 按照这个定义,其实绝大多数函数都是同步调用(例如si ...

  8. IO中同步、异步与阻塞、非阻塞的区别(转)

    转自:http://blog.chinaunix.net/uid-26000296-id-3754118.html 一.同步与异步同步/异步, 它们是消息的通知机制 1. 概念解释A. 同步所谓同步, ...

  9. IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞的比较,recv参数对性能的影响—O_NONBLOCK(open使用)、IPC_NOWAIT(msgrcv)、MSG_DONTWAIT(re

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

随机推荐

  1. 【JavaScript】动态的小球

    参考: 1.CSS 对比 JavaScript 动画 2.CSS制作水平垂直居中对齐_水平居中, 垂直居中 教程_w3cplus:https://www.w3cplus.com/css/vertica ...

  2. HTTP与服务器的四种交互方式

    Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE.URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP ...

  3. Nginx 配置文件重写

    nginx主配置文件 1.清空过Nginx配置文件,修改: vim /usr/local/nginx/conf/nginx.conf # 以那个账户,账户组来运行nginx user nobody n ...

  4. 20145201《Java程序设计》第8周学习总结

    20145201 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 通用API 15.1 日志 15.1.1 日志API简介 java.util.logging包提供了日志功 ...

  5. setState详解

    我们都知道,React通过this.state来访问state,通过this.setState()方法来更新state.当this.setState()方法被调用的时候,React会重新调用rende ...

  6. timer使用方法

    , HEART_EXPIRE}; , }; /* 第一次调用要多长时间 */ struct itimerval it; it.it_interval = tv_interval; it.it_valu ...

  7. skynet 创建存储过程脚本

    最近主程更改了数据库的操作方案,由之前的拼写sql脚本转为在mysql端创建好存储过程后,直接调用存储过程. 首先对一个表测试上述过程: 数据库端存储过程:(测试表) CREATE TABLE `ra ...

  8. 《Computational Statistics with Matlab》硬译2

    T=; sigma=; thetamin=-;thetamax=; theta=zeros(,T); seed=;rand('state',seed);randn('state',seed); the ...

  9. NumPy数据类型

    NumPy - 数据类型 NumPy 支持比 Python 更多种类的数值类型. 下表显示了 NumPy 中定义的不同标量数据类型. 序号 数据类型及描述 1. bool_存储为一个字节的布尔值(真或 ...

  10. css tips —— 神奇的max-width,min-width, width覆盖规则

    max-width在比width小时,即使width使用!important来加权,仍会max-width生效: max-width比min-width小时,width < min-width, ...