阻塞(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编程
原文地址:https://www.cnblogs.com/Leo_wl/p/2713638.html