FD_WRITE触发条件:
1.client 通过connect(WSAConnect)首次和server建立连接时,在client端会触发FD_WRITE事件
2.server通过accept(WSAAccept)接受client连接请求时,在server端会触发FD_WRITE事件
3.send(WSASend)/sendto(WSASendTo)发送失败返回WSAEWOULDBLOCK,并且当缓冲区有可用空间时,则会触发FD_WRITE事件
第1.2条其实是同一种情况,在第一次建立连接时,C/S端都会触发一个FD_WRITE事件。
主要是3这种情况:send出去的数据其实都先存在winsock的发送缓冲区中,然后才发送出去,如果缓冲区满了,那么再调用send(WSASend,sendto,WSASendTo)的话,就会返回一个 WSAEWOULDBLOCK的错误码,接下来随着发送缓冲区中的数据被发送出去,缓冲区中出现可用空间时,一个 FD_WRITE 事件才会被触发,这里比较容易混淆的是 FD_WRITE 触发的前提是 缓冲区要先被充满然后随着数据的发送又出现可用空间,而不是缓冲区中有可用空间,

FD_READ事件触发条件: 
1.在数据到达socket后,并且从来没有触发过FD_READ(也就是最开始的阶段) 
2.在数据到达socket后,并且前一个recv()调用后 
3.调用recv()后,缓冲区还有未读完的数据

FD_READ过程如下: 
1.100 bytes 数据到达,winsock2发出FD_READ 
2.程序用recv()只读入50 bytes,还剩下50 bytes 
3.winsock2继续发出FD_READ消息

recv()返回WSAEWOULDBLOCK的情况: 
1.有数据到达,FD_READ触发,该消息加入程序的消息队列 
2.在还没处理该消息前,程序就把数据recv()了 
3.等到处理该FD_READ消息时,程序调用recv()就会返回WSAEWOULDBLOCK(因为数据在这之前就recv()了)

FD_READ注意: 
1.winsock2发出一个FD_READ后,如果程序没有用recv(),即使还有数据没接收FD_READ也不会再触发另一个FD_READ,要等到recv()调用后FD_READ才会发出。 
2.对一个FD_READ多次recv()的情形:如果程序对一个FD_READ多次recv()将会造成触发多个空的FD_READ,所以程序在第2次recv()前要关掉FD_READ(可以使用WSAAsynSelect关掉FD_READ),然后再多次recv()。

3.recv()返回WSAECONNABORTED,WSAECONNRESET...等消息,可以不做任何处理,可以等到FD_CLOSE事件触发时再处理

FD_READ FD_WRITE触发时机相关推荐

  1. java串口通信DataRecive_串口通信之DataReceive事件触发时机

    环境:Windows PC.本机虚拟COM2连接COM3.串口调试助手COM2发数据 图1 1> ReceivedBytesThreshold为默认值1:2> 一次发送41个字节:3> ...

  2. FD_WRITE触发条件

    FD_WRITE触发条件: 1.client 通过connect(WSAConnect)首次和server建立连接时,在client端会触发FD_WRITE事件 2.server通过accept(WS ...

  3. SAP 电商云 Spartacus UI set delivery mode HTTP put 请求的触发时机

    看下面这段代码: context('Group Skipping - Checkout', () => {before(() => {cy.requireLoggedIn().then(( ...

  4. Android中GC的触发时机和条件

    本文分析基于Android R(11)源码 Java对象的创建由Allocator负责,回收由Collector负责.从Android O开始,对于前台应用默认的GC Collector是CC(Con ...

  5. 说明所有BeanPostProcessor的触发时机

    说明所有BeanPostProcessor的触发时机 BeanPostProcessor BeanPostProcessor postProcessBeforeInitialization: [调用时 ...

  6. Modal的二次确认弹框触发时机

    Modal的二次确认弹框触发时机 react中modal中的值变化了之后点击取消弹出二次确认弹窗,要是值没有变化可以直接关闭modal. 在项目里边有个需求,就是需要我们的modal弹窗(modal里 ...

  7. Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)

    日期 内核版本 架构 作者 GitHub CSDN 2016-07-01 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...

  8. php window.onload,window.onload 触发时机问题

    本文首发我的博客 - blog.cdswyda.com,转载务必保留作者和出处,以便追溯和错误修正. 本文关键点: window.onload 和 页面上 ajax 的成功回调到底哪个先触发. 答案是 ...

  9. linux socket 错误 Transport endpoint is not connected 在 recv shutdown 中的触发时机

    1.recv触发情况 用错了socket,把监听socket 和 连接socket 错误使用.实例如下: for(;;){socklen_t len = sizeof(client_address); ...

最新文章

  1. javascript this用法小结
  2. Selenium 1.0的历史及工作原理
  3. 一本书带你入门商业数据科学
  4. 判断一个点是否在RotatedRect中
  5. ASP.NET Core配置Kestrel 网址Urls
  6. 大数据WEB阶段总结
  7. 最短路径问题的算法实现【转载】
  8. linux让脚本在指定时间运行程序,如何限制Linux命令程序运行的时间
  9. 二叉搜索树python,代表python中的二叉搜索树
  10. mysql 更改root密码及 主机_设置更改root密码(远程,本地)、连接mysql、mysql常用命令...
  11. DTC精彩回顾—金学东:从可迁到好迁:人大金仓打造国产数据库生态 助力企业国产化转型...
  12. 灰色关联度分析_数学建模|关联分析之术|灰度预测模型预备知识
  13. 18. JSON 操作
  14. 【源码】迭代法求根的matlab算法
  15. ska测试软件怎么用,wow伤害测试软件SIMC怎么用?SIMC使用详细攻略
  16. ubuntu20.10设置桌面共享的三种方式
  17. snyk 项目漏洞检测
  18. 广播与点播、单播与组播
  19. 马赛克也被破解了!宅男的福音
  20. PHP实现一个在线选择答题系统

热门文章

  1. OpenvSwitch — Overview
  2. Linux_SystemLogManager
  3. Linux_ServicesManagement_RHEL7
  4. Altium Designer 隐藏铺铜
  5. 180.4. WebSphere Commerce Engerprise 7.0 Feature Pack 2.iso
  6. vSphere PowerCLI安装及命令
  7. GetLastError 函数返回值大全
  8. shell   脚本之 continue 与break的用法
  9. 《我是一只IT小小鸟》读后感
  10. 二位数组的子数组最大值