socket WSAAsyncSelect模式send与recv函数是非堵塞的?

mirroatl187 2014-01-13 08:53:59
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...全文
236 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
encoderlee 2014-11-21
  • 打赏
  • 举报
回复
引用 5 楼 hwzhang2012 的回复:
[quote=引用 4 楼 CharlesSimonyi 的回复:] 但WSAAsyncSelect模型并非异步IO,如果确实可发送数据时调用send,或确实有数据可接收时调用recv,是阻塞的,尤其是数据量比较大的时候更能看出。
这句话是什么意思,能否清楚地解释一下?异步IO怎么理解? WSAAsyncSelect的事件响应函数中,如果缓冲区的长度不够,不是可以多次响应接收事件的吗?我不明白什么时候会阻塞[/quote] 同步IO就是在读取或写入数据时会阻塞。比如send发送一个100kb的数据时,如果网络传输速度很慢,只有10kb/s,硬件缓冲区已满或不考虑硬件缓冲区的话,那么这个recv将阻塞约10秒才能返回。 异步IO就是在读取或写入数据时不会阻塞,调用后无论如何都能马上直接返回,系统发送或接受成功后通过事件对象通知程序。 简单来说,如果没有用setsockopt把它设置为异步IO,也就是默认是同步IO的情况下,WSAAsyncSelect模型下调用recv时,如果硬件根本没有数据可接收(对方没有发数据过来),不会阻塞,返回WSAEWOULDBLOCK错误,如果调用recv时,确实有数据可接受,但是硬件、网络的传输速度很慢很慢,只有10k/s甚至1kb/s甚至10b/s,那么即便是接受100b的数据,也是要时间的,也是要等待、要阻塞的。如果是异步IO的话,不管硬件传输速度有多慢,调用recv后马上返回,等系统以10b/s的速度把100b的缓冲区写满时,再通过事件对象通知程序。
阳光的花香 2014-11-19
  • 打赏
  • 举报
回复
引用 4 楼 CharlesSimonyi 的回复:
但WSAAsyncSelect模型并非异步IO,如果确实可发送数据时调用send,或确实有数据可接收时调用recv,是阻塞的,尤其是数据量比较大的时候更能看出。
这句话是什么意思,能否清楚地解释一下?异步IO怎么理解? WSAAsyncSelect的事件响应函数中,如果缓冲区的长度不够,不是可以多次响应接收事件的吗?我不明白什么时候会阻塞
Squall_zy 2014-01-14
  • 打赏
  • 举报
回复
WSAAsyncSelect的意思就是异步选择,是基于消息的模型。 WSAAsyncSelect 和 setsocketop 没有直接的关系。两个函数的功能不一样。 MFC 的 CAsyncSocket 和 CSocket 都是基于AsyncSelect这个模型的。 作为窗体应用程序开发,使用AsyncSelect是推荐的一种方式(尽管效率不算高),因为windows程序设计的基础就是消息路由。
encoderlee 2014-01-14
  • 打赏
  • 举报
回复
WSAAsyncSelect模型相对于同步阻塞模型来说: 同步阻塞模型下调用recv时,如果没有数据可接收,会阻塞。 WSAAsyncSelect模型下调用recv时,如果没有数据可接收,不会阻塞,返回WSAEWOULDBLOCK错误。 但WSAAsyncSelect模型并非异步IO,如果确实可发送数据时调用send,或确实有数据可接收时调用recv,是阻塞的,尤其是数据量比较大的时候更能看出。
mirroatl187 2014-01-13
  • 打赏
  • 举报
回复
WSAAsyncSelect 异步模式与setsocketop有什么区别呢?
引用 1 楼 robertcarlos 的回复:
要使用异步socket,需要在socket函数创建好一个socket句柄后,需要使用setsockopt函数对其进行设置,打开异步开关才行。
robertcarlos 2014-01-13
  • 打赏
  • 举报
回复
要使用异步socket,需要在socket函数创建好一个socket句柄后,需要使用setsockopt函数对其进行设置,打开异步开关才行。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧