网络编程中的异步、同步、阻塞、非阻塞的理解

1、异步和同步为一组对应概念。(我们讨论同步异步,都特指那些需要其他部件协作或者需要一定时间完成的任务,因为很快完成的任务无所谓同步和异步)
    同步其实就是顺序执行,如果线程A当中调用了函数B,则必须要等到B得到结果后返回,线程A才能继续进行别的工作。
   异步则和同步相对,异步在调用B的时候,虽然没有B的返回结果,但线程A可以继续执行,只是在B得到结果返回的时候通过状态、通知和回调来通知调用者A。当然,使用状态检测可能很费资源,因为你必须轮询B是否返回;而采用事件或者消息机制来通知则可以大大节省系统开销。
 
2、阻塞和非阻塞
阻塞是指在调用结果返回之前,当前线程会被挂起,suspend。这和同步不同,同步调用线程是active,这是两者关键的区别。因此,同步调用依然可以处理各种消息,但阻塞就会导致不会响应各种消息。例如recv的阻塞调用就是如此,如果socket工作在阻塞模式,直到有数据可读,线程才会被激活,而CSocket的Receive则仅仅是同步的。
非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。
一般阻塞和非阻塞函数都和调用其的对象是处在阻塞还是非阻塞模式很相关,但是并不是一一对应。
 
3、关于这几个概念在网络编程当中的应用
首先是我们看两个核心的函数sendrecv,send表示发送数据,其实际上比不是直接将数据发送出去,而是将数据先发送到系统对应的socket的缓冲区,在由tcpip 协议进行发送。此时send返回的结果只是表明是否成功发送到系统的缓冲区。同样recv函数也是从系统的对应的socket缓冲区读取数据,而该缓冲区中的数据也是由协议保证的,如果该缓冲区没有数据,则要区别对待:如果对应的socket是阻塞的,则recv工作在阻塞模式,将一直等到缓冲区中有数据才返回,否则会一直挂起。而如果socket是非阻塞模式,则recv将会立即返回SOCKET_ERROR。可见我们在这一层调用的时候,要很好的处理阻塞和非阻塞模式。
在看最关键的select函数
设置阻塞和非阻塞的函数:ioctlsocket(socket,FIOBIO,(unsigned long*)*ul);
设为非阻塞模式经常会返回WSAEWOULDBLOCK错误。意味这请求的操作再调用期间没有时间完成。所以,再非阻塞模式下应该好好检查返回代码,做好失败准备。
阻塞的优点:容易使用,缺点:在应付多个套接字和数据收发不均、时间不定时,很难管理
非阻塞的优点:强大 缺点:在每个winsock调用中,对收到的WSAEWOULDBLOCK错误难以应付。
这时,引申出了winsock的套接字I/O模型。
4、Winsock的套接字模式和套接字I/O模式:
套接字模式:主要是决定随一个套接字调用的时候,那些winsock函数的行为
套接字I/O模式: 描述应用程序如何对套接字上进行的I/O进行管理即处理
这两种模型是无关的,面向的对象不同,一种是函数,一种是I/O输入输出。
WinSock提供一些I/O模式,包括:Select选择、WSAAsyncSelect异步选择、WSAEventSelect事件选择、OverlappedI/O重叠I/O、CompletionPort完成端口六种模式。这些模式有助于应用程序通过一种“异步”的方式,一次对一个或多个套接字上的通信加以管理。
套接字可以再阻塞和非阻塞两种模式下执行I/O操作。这句话的意义是:对上面的六种模式,每种模式都有阻塞和非阻塞之分!!阻塞模式下,再I/O操作完成之前,执行操作的winsock函数会一直等候,不会立即返回,而非阻塞模式则无论如何winsock函数都会立即返回。
一般情况下建立的套接字都是阻塞的,除非调用函数设置。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值