在使用WSAAsyncSelect中的搜集到的一些资料以及发现的一些问题

在使用WSAAsyncSelect中的搜集到的一些资料以及发现的一些问题
2010年12月16日
  1. WSAEWOULDBLOCK 错误说明
  在非锁定套接字上
  函数名 说明
  WSAAccept, accept 应用程序没有收到连接请求,再次调用,便可检查连接情况
  closesocket 大多数情况下,这个错误意味着已随SO_LINGER选项一道调用了
  setsockopt,而且已设定了一个非零的超时值
  WSAConnect, connect 应用程序已初始化,再次调用,便可检查是否完成
  WSARecv,recv
  WSARecvFrom, recvfrom 没有收到数据,销后再次检查
  WSASend, send
  WSASendTo, sendto 外出数据无缓冲区可用,销后再试
  2. FD_WRITE 触发条件
  只有在三种条件下,才会发出 FD_WRITE 通知:
  . connect, WSAConnect ,一个套接字首次建立了连接;
  . accept, WSAAccept, 套接字被接受以后;
  . send, WSASend, sendto, WSASendTo操作失败,返回了 WSAEWOULDBLOCK 错误,而且缓冲再次变得可用时。
  碰到了问题:
  我现在碰到WSAEWOULDBLOCK错误消息的时候,场景很有可能是这样子的:
  1.发送缓冲满了;
  2.处于忙状态。
  如何解决
  一般来说,第一种场景是不太多发生的,而是第二种情况会很多,有可能是网络不好也有可能是服务器处理不及很繁忙。MSDN里面显示,在此时,如果发送缓冲空出来,系统会发送一个FD_WRITE消息给发送者,这时候再把发送失败的包重新发送即可。如果是缓冲区满了导致的,那么肯定会触发一条FDWRITE消息的。不过也有可能是因为忙,那么,我们可以在触发了WSAEWOULDBLOCK错误的时候,把数据放置到队列里面,给自己发送一条FD_WRITE或许也是可行的办法。
  不过根据上面的资料显示,触发条件总共有三种,收到此消息的时候可能不能辨别究竟是哪一个,其实这个很好办,只要设置一个发送队列,如果发送队列不为空,那么发送之,否则就重新进行连接或者重新进行接受。
  转自http://www.cppblog.com/tx7do/archive/2009/09/14/96 079.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值