依睛(IT blog) 我回来了,PHP<-->C/C++ LINUX

笨鸟

统计

积分与排名

友情连接

最新评论

ioctlsocket(s, FIONBIO, &ulBlocking

问:异步和同步是不是用ioctlsocket(s,   FIONBIO,   &ulBlocking);就可以设置。设置成功后recv,send也是异步的?  
  答:准确的讲不是的.是否同步还是异步看你初使化Socket时就自动生成了.如果你用WSAStartup()初使化,那么就是同步的.如果你用WSAAsyncSelect初使化,那么就是异步的.但是并不是说异步的和同步的初使化后就不能更改了.用ioctlsocket()可以控制Socket的模式,即更改同异步.但有限制.如果你想把异步的变回为同步的话,得先哦叫WSAAsyncSelect(),将最后一个参数设为0,即取消异步事件.然后再用ioctlsocket()就可以了.  
  补充:很久没上CSDN了.如答对请给分!  
  Top

 

8 楼duyhui(一天到晚游泳的鱼) 回复于 2004-04-29 16:24:34 得分 2

异步和同步用ioctlsocket(s,   FIONBIO,   &ulBlocking)是可以设置,但是有个前提条件,就是在使用这个函数前,你没有用WSAAsyncSelect(),进行设置.如果已用了WSAAsyncSelect(),那么用ioctlsocket()来设置异步和同步是无效的.  
   
  如果设置成功后recv,send也是异步的.
Top

9 楼sevencat(七猫) 回复于 2004-04-29 17:38:53 得分 0

不是异步,异步跟阻塞是两个概念。 Top

10 楼sevencat(七猫) 回复于 2004-04-29 17:50:03 得分 10

异步是你执行了一项操作,不管系统现在能不能做,程序立即返回,但系统在后台帮你在坐,并会以适当的方式通知你。  
   
  非阻塞是告诉你现在可以执行某项操作了。  
   
  通俗的比方就好像我向人要钱。  
  一种人是你要隔三差五就去问他:"有没有钱",他只会回答有钱或者没钱,你要一直问他直到他说有钱。  
  另一种人是直接跟你讲“我有钱了直接把钱打到你卡上,你不用老来找我了...”Top

11 楼halk(不当老大已经很久了) 回复于 2004-04-29 23:31:36 得分 1

sevencat(七猫)   (   )   信誉:97   解释的很好!!  
  关于阻塞或者同异步的问题看了好几个了,但一直不知道怎么才能解释清楚。唉……早知到小时候就好好学语文了Top

12 楼wangle11111(wangle) 回复于 2004-04-30 01:39:36 得分 2

恩。。是啊。。解释的不错。。学习!!  
   
  异步可以通过IOCTLSOCK来设置的。。但如果使用了   WSAASYSELECT的话,它会自动把同步变为异步的,如果想改回来的话,就要再调用一次了。如果没有调用过这个函数,那么当你建立套接字的时候,默认是同步的。。。  
   
  而SELECT这个函数是一个I/O模型,用来解决异步的一种方法.WSAASYSELECT也算是一个。。还有很多呢。。。

posted on 2008-09-19 17:55 向左向右走 阅读(8798) 评论(1)  编辑 收藏 引用 所属分类: C/C++学习资料库

评论

# re: ioctlsocket(s, FIONBIO, &ulBlocking 2008-12-20 07:42 horse

异步和非阻塞本来是一个意思,只是微软的重叠IO机制和berkeley的非阻塞实现方法的不一致才导致在微软的socket中出现了这两个意义重叠的概念.微软的socket本来就来自berkeley的socket.
换句话说,berkeley的非阻塞IO是针对socket通信的,而微软的重叠IO是针对所有设备的.但使用微软socket时还真应该把非阻塞和重叠IO严格区分开来.  回复  更多评论   

只有注册用户登录后才能发表评论。