关于FD_WRITE、FD_READ
只有在三种条件下,才会发出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相关推荐
- TCP/IP 事件选择模型
服务端: 1.打开网络库 int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); 2.校验版本号 2 != HIBYTE(wsaData ...
- 网络编程——互联网多人聊天系统
写在前面 该篇文章只是介绍性内容,完整的资源(包括代码)在主页资源→互联网多人聊天系统中 目 录 中文摘要 第1章 系统开发基础技术 1.1项目内容介绍 1.2相关技术1 1.3相关技术2 1. ...
- Windows Socket套接字(一)
MSDN:socket function 原始套接字IP 流式套接字TCP 数据包套接字UDP 一.套接字I/O模式 阻塞模式(默认)和非阻塞模式 ioctlsocket函数可设置 二.套接字函数 1 ...
- FD_READ FD_WRITE触发时机
FD_WRITE触发条件: 1.client 通过connect(WSAConnect)首次和server建立连接时,在client端会触发FD_WRITE事件 2.server通过accept(WS ...
- FD_WRITE触发条件
FD_WRITE触发条件: 1.client 通过connect(WSAConnect)首次和server建立连接时,在client端会触发FD_WRITE事件 2.server通过accept(WS ...
- Winsock异步模式I/O模型WSAEventSelect的使用
1.Winsock同步阻塞方式的问题 在异步非阻塞模式下,像accept(WSAAccept),recv(recv,WSARecv,WSARecvFrom)等这样的winsock函数调用后马上返回,而 ...
- 基于Delphi的Socket I/O模型全接触
老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系.他们的信会被邮递员投递到他们的信箱里. 这和Socket模型非常类似.下面我就以老陈接收信件为例讲解Socket I/O模型. 一:se ...
- 套接字I/O模型之WSAEventSelect
今天我又学习了一种新的套接字I/O模型------WSAEventSelect,他与WSAAsyncSelect一样也是一种异步事件通知模型,不同的是WSAAsyncSelect是与窗口句柄关联在一起 ...
- 很幽默的讲解六种Socket IO模型
很幽默的讲解六种Socket IO模型 本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...
最新文章
- 访问 Microsoft SQL Server 元数据的三种
- 驳“永远不要对一个外行聊你的专业”【十全十美】
- IOS开发常见warning汇总
- Spring Boot配置Mysql后无法根据java实体类生成table
- QT的QWinThumbnailToolBar类的使用
- C 语言快速入门,21 个小项目足矣!「不走弯路就是捷径」
- php7判断邮箱格式是否正确,利用php实现验证邮箱格式是否正确
- 信用卡不能提额,是因为使用了招联金融吗?
- 【地理建模】空间统计分析:空间权重矩阵、全局空间自相关、局部空间自相关
- 自省的力量-我看《走出软件作坊》
- 身为数据科学家怎么能不掌握这四大技能!
- 【CCCC】L2-008 最长对称子串 (25分),直接枚举遍历
- 转一篇:如何快速的修改参考文献
- 基于kafka的定时消息/任务服务
- html如实现留言板功能,JavaScript实现网页留言板功能
- KHV0031-himall3.0商城异常类(二)
- 升级计算机的图形卡和驱动程序,Win10更新显卡驱动程序后无法开机怎么办?解决方案...
- android工程师专业技能,android开发工程师简历中的专业技能怎么写
- 什么是TPS,什么是QPS,区别是什么?
- NBA不可能被破的十个记录