码迷,mamicode.com
首页 > 其他好文 > 详细

Socket调用方式(同步Vs异步;阻塞Vs非阻塞)

时间:2015-09-20 17:27:41      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

阻塞

调用我(函数),我(函数)没有接收完数据或者没有得到结果之前,我不会返回。

非阻塞

调用我(函数),我(函数)立即返回通知调用者

以最常用的send和recv两个函数为例
比如你调用send函数发送一定的Byte,在系统内部send做的工作其实只是把数据传输(Copy)到TCP/IP协议栈的输出缓冲区,它执行成功并不代表数据已经成功的发送出去了,如果TCP/IP协议栈没有足够的可用缓冲区来保存你Copy过来的数据的话...这时候就体现出阻塞和非阻塞的不同之处了:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于非阻塞的socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说:"发送操作被阻塞了!!!你想办法处理吧..." 
对于recv函数,同样道理,对于阻塞模式的socket来说如果TCP/IP协议栈的接收缓冲区没有通知一个结果给它它就一直不返回:耗费着系统资源....对于非阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK---"现在没有数据,回头再来看看"

技术分享

技术分享

 

同步:

我调用一个功能,该功能没有结束前,我死等结果。

异步:

当一个异步过程调用发出后,调用者不能立刻得到结果。该功能在完成后,通过状态、通知和回调来通知调用者。

同步与阻塞的区别: 阻塞调用是指调用结果返回之前,当前线程会被挂起。对于同步调用来说,虽然调用的函数没有返回,但当前线程还是激活的。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息(同步&非阻塞)。socket接收数据的另外一个函数recv则是一个阻塞调用的例子,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止(同步&阻塞)。

Socket调用方式(同步Vs异步;阻塞Vs非阻塞)

标签:

原文地址:http://www.cnblogs.com/qionglouyuyu/p/4823611.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!