FD_READ FD_WRITE触发时机
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触发时机相关推荐
- java串口通信DataRecive_串口通信之DataReceive事件触发时机
环境:Windows PC.本机虚拟COM2连接COM3.串口调试助手COM2发数据 图1 1> ReceivedBytesThreshold为默认值1:2> 一次发送41个字节:3> ...
- FD_WRITE触发条件
FD_WRITE触发条件: 1.client 通过connect(WSAConnect)首次和server建立连接时,在client端会触发FD_WRITE事件 2.server通过accept(WS ...
- SAP 电商云 Spartacus UI set delivery mode HTTP put 请求的触发时机
看下面这段代码: context('Group Skipping - Checkout', () => {before(() => {cy.requireLoggedIn().then(( ...
- Android中GC的触发时机和条件
本文分析基于Android R(11)源码 Java对象的创建由Allocator负责,回收由Collector负责.从Android O开始,对于前台应用默认的GC Collector是CC(Con ...
- 说明所有BeanPostProcessor的触发时机
说明所有BeanPostProcessor的触发时机 BeanPostProcessor BeanPostProcessor postProcessBeforeInitialization: [调用时 ...
- Modal的二次确认弹框触发时机
Modal的二次确认弹框触发时机 react中modal中的值变化了之后点击取消弹出二次确认弹窗,要是值没有变化可以直接关闭modal. 在项目里边有个需求,就是需要我们的modal弹窗(modal里 ...
- Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十)
日期 内核版本 架构 作者 GitHub CSDN 2016-07-01 Linux-4.6 X86 & arm gatieme LinuxDeviceDrivers Linux进程管理与调度 ...
- php window.onload,window.onload 触发时机问题
本文首发我的博客 - blog.cdswyda.com,转载务必保留作者和出处,以便追溯和错误修正. 本文关键点: window.onload 和 页面上 ajax 的成功回调到底哪个先触发. 答案是 ...
- linux socket 错误 Transport endpoint is not connected 在 recv shutdown 中的触发时机
1.recv触发情况 用错了socket,把监听socket 和 连接socket 错误使用.实例如下: for(;;){socklen_t len = sizeof(client_address); ...
最新文章
- javascript this用法小结
- Selenium 1.0的历史及工作原理
- 一本书带你入门商业数据科学
- 判断一个点是否在RotatedRect中
- ASP.NET Core配置Kestrel 网址Urls
- 大数据WEB阶段总结
- 最短路径问题的算法实现【转载】
- linux让脚本在指定时间运行程序,如何限制Linux命令程序运行的时间
- 二叉搜索树python,代表python中的二叉搜索树
- mysql 更改root密码及 主机_设置更改root密码(远程,本地)、连接mysql、mysql常用命令...
- DTC精彩回顾—金学东:从可迁到好迁:人大金仓打造国产数据库生态 助力企业国产化转型...
- 灰色关联度分析_数学建模|关联分析之术|灰度预测模型预备知识
- 18. JSON 操作
- 【源码】迭代法求根的matlab算法
- ska测试软件怎么用,wow伤害测试软件SIMC怎么用?SIMC使用详细攻略
- ubuntu20.10设置桌面共享的三种方式
- snyk 项目漏洞检测
- 广播与点播、单播与组播
- 马赛克也被破解了!宅男的福音
- PHP实现一个在线选择答题系统
热门文章
- OpenvSwitch — Overview
- Linux_SystemLogManager
- Linux_ServicesManagement_RHEL7
- Altium Designer 隐藏铺铜
- 180.4. WebSphere Commerce Engerprise 7.0 Feature Pack 2.iso
- vSphere PowerCLI安装及命令
- GetLastError 函数返回值大全
- shell 脚本之 continue 与break的用法
- 《我是一只IT小小鸟》读后感
- 二位数组的子数组最大值