社区
Linux/Unix社区
帖子详情
续:epoll网络模型的问题
fengge8ylf
2006-04-18 01:17:08
发送时改用提交EVENTS的方式,没再出现"errno的值是11 字符描述是Resource temporarily unavailable"的错误,但又有新问题了.我快速提交了100个EVENT,但epoll_wait有时返回98个有时返回99个;如果我减慢提交EVENT的速度,能返回100个.这是什么原因.
原贴:http://community.csdn.net/Expert/topic/4681/4681540.xml?temp=.8336908
...全文
399
30
打赏
收藏
续:epoll网络模型的问题
发送时改用提交EVENTS的方式,没再出现"errno的值是11 字符描述是Resource temporarily unavailable"的错误,但又有新问题了.我快速提交了100个EVENT,但epoll_wait有时返回98个有时返回99个;如果我减慢提交EVENT的速度,能返回100个.这是什么原因. 原贴:http://community.csdn.net/Expert/topic/4681/4681540.xml?temp=.8336908
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
30 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fierygnu
2006-04-19
打赏
举报
回复
不需要EPOLL_CTL_MOD。直接在开始时一次性用EPOLL_CTL_ADD提交EPOLLIN | EPOLLOUT就可以了。
fengge8ylf
2006-04-19
打赏
举报
回复
下午测试一下 先读 读完后写 后完后读 呵呵
else if(events[i].events&EPOLLIN)
{
if ( (sockfd = events[i].data.fd) < 0) continue;
if ( (n = read(sockfd, line, MAXLINE)) < 0) {
if (errno == ECONNRESET) {
close(sockfd);
events[i].data.fd = -1;
} else
std::cout<<"readline error"<<std::endl;
} else if (n == 0) {
close(sockfd);
events[i].data.fd = -1;
}
//设置用于写操作的文件描述符
ev.data.fd=sockfd;
//设置用于注测的写操作事件
ev.events=EPOLLOUT|EPOLLET;
//修改sockfd上要处理的事件为EPOLLOUT
epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
}
else if(events[i].events&EPOLLOUT)
{
sockfd = events[i].data.fd;
write(sockfd, line, n);
//设置用于读操作的文件描述符
ev.data.fd=sockfd;
//设置用于注测的读操作事件
ev.events=EPOLLIN|EPOLLET;
//修改sockfd上要处理的事件为EPOLIN
epoll_ctl(epfd,EPOLL_CTL_MOD,sockfd,&ev);
}
}
fierygnu
2006-04-19
打赏
举报
回复
问题就出在EPOLLET 啊:)
实际上缓冲区里最后还有数据,但因为EPOLLET 不满足,所以不会触发读。
fengge8ylf
2006-04-19
打赏
举报
回复
但我就是想用EPOLLET 呵呵 那个问题还没解决 就是"我快速提交了100个EVENT,但epoll_wait有时返回98个有时返回99个;如果我减慢提交EVENT的速度,能返回100个" 不明白问题出在那里
谢谢 fierygnu(va_list) 200分都给你了
fierygnu
2006-04-19
打赏
举报
回复
当然不能采用EPOLLET :)
EPOLLET 是边界触发,即从无到有或从有到无。不用的时候,就是看有没有。
fengge8ylf
2006-04-19
打赏
举报
回复
又一个测试结果
如果不采用EPOLLET 则剩下的3K的数据能接收到
采用EPOLLET和不采用EPOLLET有什么不同 好像EPOLLET的效率比较高
fengge8ylf
2006-04-19
打赏
举报
回复
是这么回事 如果客户端发送了8K的数据 但是服务器接收时指定接收5K的数据(recv第三个参数可设定) 除非再次提交(或修改成)EPOOLLIN 不然剩下的3K的数据是接收不到的 因为epoll_wait不再返回 通过测试知道的
我的程序设计成先接收包头 然后根据包头接收包体 所以接收完包头后需要再次提交EPOOLLIN
fierygnu
2006-04-19
打赏
举报
回复
当然是的:)
说不清,我也懒,看看http://blog.kovyrin.net/2006/04/13/epoll-asynchronous-network-programming/
基本的使用架构。
fengge8ylf
2006-04-19
打赏
举报
回复
不是吧 我接收时每次接收完了还要提交一次EPOOLLIN 不然的话后面的数据就接收不到了 我用的是MOD 不是ADD
fierygnu
2006-04-19
打赏
举报
回复
提交一次后,epoll_wait就会自动监听那些描述符了。man epoll
fengge8ylf
2006-04-19
打赏
举报
回复
不调用100次epoll_ctl 那怎么办 我要等epoll_wait返回后才发送数据的 100个单独的包肯定要提交100次epoll_ctl
fierygnu
2006-04-19
打赏
举报
回复
如果这里的提交意思是send/write,那是对的。如果是调用100次epoll_ctl,那就不对了。
fengge8ylf
2006-04-19
打赏
举报
回复
一个socket发送 就一个客户端一个服务器
fengge8ylf
2006-04-19
打赏
举报
回复
肯定要提交100次 100个包不是一次性接收的
fierygnu
2006-04-19
打赏
举报
回复
是。
fengge8ylf
2006-04-19
打赏
举报
回复
有个小小问题 如果同时提交EPOLLIN | EPOLLOUT 有可能当因为EPOLLOUT而epoll_wait返回时 这时可能没发送的数据 那么这次epoll_wait就白白循环了
fengge8ylf
2006-04-19
打赏
举报
回复
哈哈 搞定了 多谢
fierygnu
2006-04-18
打赏
举报
回复
100个包是用几个socket发送的?如果是1个socket提交一次EPOLLOUT就可以了,怎么会提交100次?
fengge8ylf
2006-04-18
打赏
举报
回复
就是客户端发送了100个数据包 服务器也要返回100个数据包 每个数据包(做了拆包)都要提交一次EPOLLOUT 当epoll_wait返回时调用send发送数据包
fierygnu
2006-04-18
打赏
举报
回复
“提交了100个EPOLLOUT”我不明白:(
加载更多回复(10)
python入门到高级全栈工程师培训 第3期 附课件代码
09 select与
epoll
的实现区别 第36章 01 异步IO 02 selectors模块介绍 03 selectors模块应用 04 作业介绍 第37章 01 selctors实现文件上传与下载 02 html的介绍 03 html文档树的概念 04 meta标签以及一些基本标签...
epoll
简介及触发模式(accept、read、send)
1、
epoll
的简单介绍 2、
epoll
在LT和ET模式下的读写方式 一、
epoll
的接口非常简单,一共就三个函数:1. int
epoll
_create(int size); 创建一个
epoll
的句柄,size用来告诉内核这个监听的数目一共有多大。这个...
linux服务器开发人员必须要彻底理解的关于【Linux】IO的线程
模型
reactor
模型
应用视频讲解:
epoll
原理剖析以及reactor
模型
应用 c/c++linux服务器开发高级架构师免费学习视频点击:C/C++Linux服务器开发高级架构师/Linux后台开发架构师 一、线程
模型
介绍 为了应对高并发的...
网络
io与select,poll,
epoll
这给
网络
编程带来了一个很大的
问题
,如在调用 send()的同时,线程将被阻塞,在此期间,线程 将无法执行任何运算或响应任何的
网络
请求。 一个简单的改进方案是在服务器端使用多线程(或多进程)。多线程(或多进程)的...
高性能
网络
模型
高性能
网络
模型
1 服务端处理
网络
请求2 I/O
模型
2.1 概念理论2.2 阻塞式I/O
模型
(blocking I/O)2.3 非阻塞式I/O
模型
(non-blocking I/O)2.4 I/O复用
模型
(I/O multiplexing)2.5 信号驱动式I/O
模型
(signal-driven I/O)...
Linux/Unix社区
23,121
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章