续: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 打赏 收藏 转发到动态 举报
写回复
用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)

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧