社区
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
...全文
430
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
作业
写回复
配置赞助广告
用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)
http server&client;(
epoll
模型
)
http server&client;(
epoll
模型
),支持文件下载,
续
传,IPV6,页面展示,hls协议。本代码已经商用。压力测试通过
计算机
网络
编程(课件)
很不错的
网络
编程教学资料 第1章
网络
编程基础 第2章 基于NetBIOS的
网络
编程 第3章 基于TCP-IP协议的
网络
编程 第4,5章 进程与线程 第6章高级
网络
编程 第7章 直接
网络
编程技术
网络
编程飞鸽传输
涉及linux很多
网络
编程方面的知识 挺不错的
百度校园招聘历年经典面试题汇总:C++研发 1
百度校园招聘历年经典面试题汇总:C++研发岗(1)、写算法,二叉树按层遍历,用双向链表把节点连起来(2)、一个无序自然数数列,给定一个数M,选取自然数数列中两个
C++
网络
编程
实现了基本的
网络
编程,不错的学习资料,可以来看看
Linux/Unix社区
23,217
社区成员
74,540
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章