只有在三种条件下,才会发出FD_WRITE通知:
■ 使用connect或WSAConnect,一个套接字首次建立了连接。
■ 使用accept或WSAAccept,套接字被接受以后。
■ 若send、WSASend、sendto或WSASendTo操作失败,返回了WSAEWOULDBLOCK错误,而且缓冲区的空间变得可用

因此,作为一个应用程序,自收到首条FD_WRITE消息开始,便应认为自己必然能在一
个套接字上发出数据,直至一个send、WSASend、sendto或WSASendTo返回套接字错误
WSAEWOULDBLOCK。经过了这样的失败以后,要再用另一条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()了)

注意:
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_WRITE、FD_READ相关推荐

  1. TCP/IP 事件选择模型

    服务端: 1.打开网络库 int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); 2.校验版本号 2 != HIBYTE(wsaData ...

  2. 网络编程——互联网多人聊天系统

    写在前面 该篇文章只是介绍性内容,完整的资源(包括代码)在主页资源→互联网多人聊天系统中 目    录 中文摘要 第1章 系统开发基础技术 1.1项目内容介绍 1.2相关技术1 1.3相关技术2 1. ...

  3. Windows Socket套接字(一)

    MSDN:socket function 原始套接字IP 流式套接字TCP 数据包套接字UDP 一.套接字I/O模式 阻塞模式(默认)和非阻塞模式 ioctlsocket函数可设置 二.套接字函数 1 ...

  4. FD_READ FD_WRITE触发时机

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

  5. FD_WRITE触发条件

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

  6. Winsock异步模式I/O模型WSAEventSelect的使用

    1.Winsock同步阻塞方式的问题 在异步非阻塞模式下,像accept(WSAAccept),recv(recv,WSARecv,WSARecvFrom)等这样的winsock函数调用后马上返回,而 ...

  7. 基于Delphi的Socket I/O模型全接触

    老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系.他们的信会被邮递员投递到他们的信箱里. 这和Socket模型非常类似.下面我就以老陈接收信件为例讲解Socket I/O模型. 一:se ...

  8. 套接字I/O模型之WSAEventSelect

    今天我又学习了一种新的套接字I/O模型------WSAEventSelect,他与WSAAsyncSelect一样也是一种异步事件通知模型,不同的是WSAAsyncSelect是与窗口句柄关联在一起 ...

  9. 很幽默的讲解六种Socket IO模型

    很幽默的讲解六种Socket IO模型   本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...

最新文章

  1. 访问 Microsoft SQL Server 元数据的三种
  2. 驳“永远不要对一个外行聊你的专业”【十全十美】
  3. IOS开发常见warning汇总
  4. Spring Boot配置Mysql后无法根据java实体类生成table
  5. QT的QWinThumbnailToolBar类的使用
  6. C 语言快速入门,21 个小项目足矣!「不走弯路就是捷径」
  7. php7判断邮箱格式是否正确,利用php实现验证邮箱格式是否正确
  8. 信用卡不能提额,是因为使用了招联金融吗?
  9. 【地理建模】空间统计分析:空间权重矩阵、全局空间自相关、局部空间自相关
  10. 自省的力量-我看《走出软件作坊》
  11. 身为数据科学家怎么能不掌握这四大技能!
  12. 【CCCC】L2-008 最长对称子串 (25分),直接枚举遍历
  13. 转一篇:如何快速的修改参考文献
  14. 基于kafka的定时消息/任务服务
  15. html如实现留言板功能,JavaScript实现网页留言板功能
  16. KHV0031-himall3.0商城异常类(二)
  17. 升级计算机的图形卡和驱动程序,Win10更新显卡驱动程序后无法开机怎么办?解决方案...
  18. android工程师专业技能,android开发工程师简历中的专业技能怎么写
  19. 什么是TPS,什么是QPS,区别是什么?
  20. NBA不可能被破的十个记录

热门文章

  1. 【无标题】无法登录 MySQL 服务器
  2. 机械妖姬上门要源码,给她吗?
  3. AMD 和 INTEL,运行Java哪个更好?
  4. 推荐一款国内最好的个人知识管理、笔记软件,学习工作最好帮手
  5. 01 matplotlib绘图初体验
  6. 第十二届蓝桥杯省赛Python--暴力破解
  7. 电脑错误代码0x8007007e怎么修复?
  8. 尚观ULE 文件属性
  9. linux 编译汇编,linux下的汇编教程
  10. 中鑫吉鼎|低收入家庭要实现财务自由应该如何理财