zoukankan      html  css  js  c++  java
  • 阻塞(Blocking),非阻塞(NonBlocking),同步(Sync),异步(Async),重叠(Overlapped)

    [转载请注明:出自cnblogs,作者:byeyear,Email:east3@163.com]

    本文主要讨论几个在网络编程中经常被讨论但也经常被误解的概念:

    阻塞(Blocking),非阻塞(Non-Blocking),同步(Sync),异步(Async),重叠(Overlapped)。

    首先要明确的是,只有那些会导致发生“数据传输”的函数(accept,connect,send,recv等)才存在这些概念;像socket、bind、listen这些不会引发“数据传输”的函数,是不存在“阻塞非阻塞”或“同步异步”这样的问题的。

    其次一个比较重要的问题是,Non-Blocking和Async不是一回事。在一些论坛和关于网络编程的书中,将这两者等同,这是不正确的。

    1. Blocking和Non-Blocking

    Blocking:只有在函数所请求的操作完成后,函数才会返回。例如,accept会等到连接队列非空才返回;recv会等到数据缓冲区中有数据后才返回。因此,blocking的意思是,操作若不能完成函数就不返回。

    Non-Blocking:如果操作无法立即完成,send/recv这样的函数将以失败返回,函数所请求的操作不会得到执行。同时WSAGetLastError函数将返回WSAEWOULDBLOCK。例如,如果缓冲区中没有数据,recv会立即返回。在Non-Blocing模式下,程序可以通过一个循环不停调用recv,直到有数据可用。

    2. Async和Overlapped

    Async和Overlapped实际上是一个概念。如果我们在调用WSASocket函数的时候指定了WSA_FLAG_OVERLAPPED参数,或直接使用socket函数,那么得到的socket将是支持异步操作的(但却是Blocking的)。你可以使用WSASend,WSARecv等函数,配合Overlapped结构实现Async IO。

    如果一个Async IO不能立即完成,函数将以失败返回,同时你WSAGetLastError将返回WSA_IO_PENDING。但是,底层的操作将继续执行。你的程序将在稍后得到通知。

    综上,我们可以得到socket I/O操作的三种方法,列于下表:

    Blocking,Sync 函数请求的操作完成后才返回  
    Non-Blocking,Sync 函数请求的操作若不能立即完成,函数将立即返回 函数请求的操作将不会得到执行 
    Non-Blocking,Async 函数请求的操作若不能立即完成,函数将立即返回 函数请求的操作将继续执行

     参考文档:http://support.microsoft.com/kb/181611/en-us?fr=1

     
    分类: Windows编程
  • 相关阅读:
    [NOI2002]银河英雄传说
    Splay普及版
    线段树普及版
    长连接与短连接
    【HTTP】中Get/Post请求区别
    【HTML】知识笔记
    SVN使用教程总结
    《人生只有一次,去做自己喜欢的事》读书笔记
    【HTTP】无状态无连接的含义
    【HTML】解析原理
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2713638.html
Copyright © 2011-2022 走看看