WSAEventSelect IO复用模型
1 今天帮一学习WSAEventSelect的网友排查一个测试用服务器端recv返回0的问题,出现这个问题直观判断一般是客户端socket关闭了,可是他的代码很简单并且是本机测试,通过wireshark抓包也没有发现客户端发送了FIN分节,错误码为0,一切看起来都是正常的。正当无思路时,突然想到会不会是将recv的缓冲区长度参数给设置为0了呢,后发现果然如此,代码如下:
else if(event.lNetworkEvents & FD_READ) // 处理FD_READ通知消息
{
if(event.iErrorCode[FD_READ_BIT] == )
{
char szText[];
int nRecv = ::recv(sockArray[i], szText, strlen(szText), );
if(nRecv > )
{
szText[nRecv] = '\0';
printf("接收到数据:%s \n", szText);
}
}
szText是栈的一个没有初始化的字符数组,strlen(szText)返回值就有很大随机性了,这里要改为sizeof(szText)-1。
2 WSAEventSelect模型最多复用64个socket,这个说法是片面的,这是由于将每一个socket描述符对应一个事件句柄,从而达到了WSAWaitForMultipleEvents这个函数所要求的等待事件的上限造成的,实际中也可以通过WSAEventSelect调用将多个socket关联到一个事件句柄上,WSAWaitForMultipleEvents只等待一件事件即可,这样可以复用多于64个socket。
3 在用WSAEnumNetworkEvents返回的event的lNetworkEvents与FD_xxxx相与判断相应事件时不应该if...else if...else if,要if ... if ... if ...,因为有时候一个socket会返回多个事件。
4 WSAEventSelect模型时如何发送数据,首先创建socket(服务器端通过accept) fd,然后调用ioctlsocket这个将fd设为非阻塞模式,接下来调用WSAEventSelect将该fd同一个事件event相关联,关联事件属性之一为FD_WRITE,这样在接下来通过WSAWaitForMultipleEvents等待前述event时或直接调用WSAEnumNetworkEvents,一定会有第一个FD_WRITE事件可用,此时若有数据可写可在此事件中写,若无可跳过,接下来在收到FD_CLOSE事件之前都是可以直接send数据并判断返回值,若返回值为-1且错误码为WSAEWOULDBLOCK,说明低层socket发送缓存区满了,此时应用程序要记忆已发送位置,并在下一个FD_WRITE事件到来时继续发送余下的或更新的数据。
WSAEventSelect IO复用模型的更多相关文章
- Linux非阻塞IO(二)网络编程中非阻塞IO与IO复用模型结合
上文描述了最简易的非阻塞IO,采用的是轮询的方式,这节我们使用IO复用模型. 阻塞IO 过去我们使用IO复用与阻塞IO结合的时候,IO复用模型起到的作用是并发监听多个fd. 以简单的回射服务器 ...
- 多路IO复用模型--select, poll, epoll
select 1.select能监听的文件描述符个数受限于FD_SETSIZE,一般为1024,单纯改变进程打开的文件描述符个数并不能改变select监听文件个数 2.解决1024以下客户端时使用se ...
- 7.3 5种IO模型与IO复用
5种IO模型分别如下: 1.阻塞IO模型 当上层应用app1调用recv系统调用时,如果对等方没有发送数据(缓冲区没有数据),上层app1将阻塞(默认行为,被linux内核阻塞). 当对等方发送了数据 ...
- 一只简单的网络爬虫(基于linux C/C++)————浅谈并发(IO复用)模型
Linux常用的并发模型 Linux 下设计并发网络程序,有典型的 Apache 模型( Process Per Connection ,简称 PPC ), TPC ( Thread Per Conn ...
- IO复用(较详细)
进程与线程的描述 一个进程至少会创建一个线程,多个线程共享一个程序进程的内存.程序的运行最终是靠线程来完成操作的.线程的数量跟CPU核数有关,一个核最多能发出两个线程.线程的操作主要分为:一:给CPU ...
- IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别参考
参考https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral IO复用,AI ...
- IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别(百度)
如果面试问到IO操作,这篇文章提到的问题,基本是必问,百度的面试官问我三个问题 (1)什么是NIO(Non-blocked IO),AIO,BIO (2) java IO 与 NIO(New IO)的 ...
- IO复用\阻塞IO\非阻塞IO\同步IO\异步IO
转载:IO复用\阻塞IO\非阻塞IO\同步IO\异步IO 一. 什么是IO复用? 它是内核提供的一种同时监控多个文件描述符状态改变的一种能力:例如当进程需要操作多个IO相关描述符时(例如服务器程序要同 ...
- (转)IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别
本文来自:https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral,非常感谢 ...
随机推荐
- dotTrace 学习笔记
KEYGEN!你懂的(点击下载),仅供学习参考! jetbrains 全系列产品,仅支持最新版本(Ultimate 版本),源码就不提供了,感兴趣的自行反编译一下,未混淆.
- C++函数调用
C++函数调用(1) 这篇博客名字起得可能太自大了,搞得自己像C++大牛一样,其实并非如此.C++有很多隐藏在语法之下的特性,使得用户可以在不是特别了解的情况下简单使用,这是非常好的一件事情.但是有时 ...
- service structure flowchart [mobile to server via HTTP RESTful API]
Modern flowchart for mobile, server, and etc.. communication This has something to do with these sou ...
- jQuery动态操作表单
<html> <head> <title>jquery表格操作</title> <script language="javascript ...
- Bek Trak Trik for wireless WPA/WPA2 & SSH & email
FOR wireless tools: hydra, medusa, crunch, aircrack-ng packages (airodump-ng, airmon-ng, aircrack-ng ...
- YC(Y Combinator)斯坦福大学《如何创业》课程要点记录(粗糙)
20节课程,每节都是干货满满,时常听说理论无用,但是好的理论,绝对能帮助你少走一些弯路. YC简介: Y Combinator成立于2005年,是美国著名创业孵化器,Y Combinator扶持初创企 ...
- 项目开发之分页---异步分页(ajax)
PS:前面忘了给大家讲解后台需要做的 ,同步分页的时候,我们只需要定义一个方法,给前台传递一个page对象,前台接收到直接展示即可:异步分页要多一步,首先还是写一个方法,传递初始对象,后面的ajax返 ...
- headfirst设计模式(1)—策略模式
什么是策略模式 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化(摘自百度百科) 关键字:算法封装,相互替换,独立变化 算法封装 ...
- Ueditor1.4.3实现跨域上传到独立文件服务器,完美解决单文件和多文件上传!
再写配置方法之前先吐槽一下网上的各种教程,TM没一个有卵用,一群傻屌不会写就别写,写了就要负责. 百度google搜了半天,全是配置什么document.domain,根域名什么的,我只想对你说: 好 ...
- html&css入门详解
本系列主要讲解html与css的知识点,因为是参考的英文版的<html&css design and build websites>,所以可能会有个人翻译理解上的差错,希望观者能够 ...