阻塞(Blocking),非阻塞(NonBlocking),同步(Sync),异步(Async),重叠(Overlapped)
Blocking/Non-Blocking VS Sync/Async VS 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编程
标签: Blocking Non-Blocking Sync Async Overlapped
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于阻塞(Blocking),非阻塞(NonBlocking),同步(Sync),异步(Async),重的详细内容...