WSAWaitforMultEvent使用

今天看了段代码,比较奇怪,recv先接受了4字节(该四字节为一个包的包大小),然后调用WSAWaitForMultEvent等待事件到来,再读取剩余的数据。而发送端则是将包大小和数据一同发送 4+N  4:数据包大小,N数据包。同时WSAEvnetSelct设置为FD_READ|FD_CLOSE

后来查了查,才明白:如果传递给recv()的缓冲区不足以一次容纳所有数据,那系统会保持FD_READ消息(也就是再次设置对应的事件为激发状态),直到完全读取了所有接收到的数据为止

 http://yukei.blog.163.com/blog/static/11258770320106224717808/

FD_READ: 这个很简单,当这个消息出现时,说明目标Socket收到了远端发送过来的消息,此时调用recv()即可读取到数据,如果传递给recv()的缓冲区不足以一次容纳所有数据,那系统会保持FD_READ消息(同时,由于WSAEVENT的创建是手动模式,所以该事件会一直处于激发态,直到用户ResetEvent才会改变为无信号状态),直到完全读取了所有接收到的数据为止

 

FD_WRITE: 这个略微复杂一点,也是本次探究的重点。其实问题的关键出在怎么理解这个消息。 FD_WRITE消息的出现说明当前对目标socket可以调用send()进行数据发送操作。第一次FD_WRITE消息出现在socket建立连接完成后,这很好理解,系统是想告诉你现在链接已经建立完成,可以发送数据了。但是下一次FD_WRITE什么时候出现?答案是直到你填满了socket底层的发送缓冲区之后(也就是某次调用send()返回  WSAEWOULDBLOCK 后,当系统底层完成了数据的发送后,底层的send缓冲区空闲下来时。很多人(包括我在内)一开始对FD_WRITE的理解有一定偏差,认为调用send()后要等待FD_WRITE才能再次调用下次send(),导致出现很莫名其妙的问题

posted on 2012-12-12 15:04  远行的帆 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/yuanxingdefan/archive/2012/12/12/2814666.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值