社区
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
...全文
473
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)
用基于
epoll
的reactor
网络
模型
实现http server
本文介绍如何使用基于
epoll
的reactor
模型
实现一个简单的HTTP Server。该Server支持显示字符、文件及图片,并通过状态机处理文件的大块传输。
网络
模型
:
epoll
博客围绕
网络
模型
epoll
展开,但具体内容缺失。
epoll
是
网络
编程中的重要
模型
,在处理高并发
网络
连接等场景有重要作用。
Linux
网络
模型
epoll
本文深入解析了
epoll
作为Linux内核实现的一种高效IO多路复用机制,详细介绍了其核心API:
epoll
_create、
epoll
_ctl及
epoll
_wait的功能与使用方法。并通过解释水平触发(LT)与边沿触发(ET)的区别,帮助读者理解如何更有效地利用
epoll
进行并发I/O处理。
Linux select/
epoll
网络
模型
本文详细解析了Linux环境下
epoll
和select
网络
模型
的优劣,并提供了基于
epoll
模型
的TCP服务器C代码实现,同时展示了如何使用
epoll
进行高效的数据处理。
redis
网络
模型
select、poll、
epoll
文章详细探讨了Redis
网络
模型
中采用单线程的原因,以及与阻塞IO、非阻塞IO、IO多路复用(如
epoll
、select和poll)的关系,强调了多线程对Redis性能影响的分析和事件通知机制的重要性。,
Linux/Unix社区
23,223
社区成员
74,536
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章