免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4424 | 回复: 10
打印 上一主题 下一主题

[C] epollout 有什么用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-03 09:16 |只看该作者 |倒序浏览
发现以前有人在别的地方问过类似的问题,但是没人解答:
“Linux下的I/O复用epoll,我一直对这个EPOLLOUT事件有一些疑问
当我们调用epoll_wait函数返回时,我们应该可以获得一个就绪事件的列表,然后我们可以遍历这个列表,然后查看每一个就绪的文件描述符上发生的事件,然后针对不同的时间进行操作。
对于常用的EPOLLIN,EPOLLRDHUP我都理解,例如
在发生EPOLLIN的时候,如果是监听socket上,那么我们调用accept来接受新连接
如果是普通socket,那么我们调用recv来接受新数据。
可是对于EPOLLOUT事件,其表示数据可写。但是在服务器一端来说,一般时我们接受客户端的请求,然后处理请求,最后直接将处理结果调用send函数发送给客户端,我实在没有看出在这一步有任何需要在调用epoll_wait函数等待EPOLLOUT事件的必要,
或者说,我不是很了解在什么情况之下调用epoll_wait函数后会触发EPOLLOUT事件,以及当我们检测到这个事件发生的时候我们应该如何处理这个事件。
等待高人解答呀 ”

补充一下:很多通信都不是严格 :接收---发送--接收
而是:接收--接收。。。直到有结束标志---发送---接收
所以在epollin之后,立刻mod到epollout是不正确的
另外epollin就可以监听read的socket了。然后write这个socket就可以了。完全可以不用epollout啊

请大牛指教

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
2 [报告]
发表于 2014-10-03 14:43 |只看该作者
场景之一:
write()失败,返回EAGAIN,这时候就等OUT事件再次写。

论坛徽章:
0
3 [报告]
发表于 2014-11-13 14:29 |只看该作者
回复 2# ilex


    我的concern是当
sockfd在epollin 的时候会接收数据,然后epoll_mod_ctl改成epollout,这表示这个sockfd,不在是监听有无数据来了吗?
而是作为写的socket了。
如果是这样,这不是**了,接收--接收--接收--发送的顺序了吗。
比如说client 发三次
send 1 发送"12345"
send 1 发送"abc"
send 1 发送"#\n"

server在收到\n后才反应,即server 3次recieve后才send。
如果在第一次就将epollin改为epollout,岂不是send 早了吗

求大牛们解释一下,没人会吗?

论坛徽章:
12
巳蛇
日期:2013-09-16 15:32:242015年辞旧岁徽章
日期:2015-03-03 16:54:152015年亚洲杯之约旦
日期:2015-02-11 14:38:37双鱼座
日期:2015-01-05 11:05:47戌狗
日期:2014-12-08 09:41:18戌狗
日期:2014-08-15 09:29:29双子座
日期:2014-08-05 09:17:17卯兔
日期:2014-06-08 15:32:18巳蛇
日期:2014-01-27 08:47:08白羊座
日期:2013-11-28 21:04:15巨蟹座
日期:2013-11-13 21:58:012015年亚洲杯之科威特
日期:2015-04-17 16:51:51
4 [报告]
发表于 2014-11-13 14:34 |只看该作者
不是顺序问题,如果你要发送的数据量大,比如100M,肯定不能一次写完的。

论坛徽章:
0
5 [报告]
发表于 2014-11-13 19:05 |只看该作者
本帖最后由 xphh2008 于 2014-11-13 19:05 编辑

楼主似乎理解有偏差,2楼已经说的很明确了,没有什么需要再解释的了。

建议下个epoll的demo,仔细研究一下。

论坛徽章:
0
6 [报告]
发表于 2014-11-15 22:16 |只看该作者
回复 2# ilex


    自己晕乎了,和顺序是没关系的,因为read是被动的,但是写是主动的。所以啥时候写自己能控制。
    但是在epollin中直接send 不行吗,why啥非要epoll_mod_ctrl 到epollout在写呢。
    如果直接写,会有问题,why啥select ,poll这么做没问题呢,如果有问题它们怎么处理,epoll怎么处理呗,
    总之,没必要加epollout啊

论坛徽章:
0
7 [报告]
发表于 2014-11-16 12:22 |只看该作者
本帖最后由 xphh2008 于 2014-11-16 12:23 编辑
fufelixzh 发表于 2014-11-15 22:16
回复 2# ilex

    但是在epollin中直接send 不行吗,why啥非要epoll_mod_ctrl 到epollout在写呢。
    如果直接写,会有问题,why啥select ,poll这么做没问题呢,如果有问题它们怎么处理,epoll怎么处理呗,
    总之,没必要加epollout啊


UDP是没关系的。但是TCP假如你要发送1000字节,调用send返回只有500字节发送成功,要么你什么时候去发剩下500字节呢?死循环发送吗?

所以必须有个回调告诉你这个socket什么时候有能力再次发送。明白?

select和poll也是有写事件的。如果你没有处理过写事件,那你写出来的网络程序都是有问题的。

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
8 [报告]
发表于 2014-11-17 19:58 |只看该作者
fufelixzh 发表于 2014-11-15 22:16
回复 2# ilex



谁说select没有?

int select (int maxfd + 1,fd_set *readset,fd_set *writeset, fd_set *exceptset,const struct timeval * timeout);

writeset,这个被你咔擦掉了?

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
9 [报告]
发表于 2014-11-17 20:00 |只看该作者
fufelixzh 发表于 2014-11-15 22:16
回复 2# ilex


poll没用过,看度娘
http://baike.baidu.com/view/2997591.htm?fr=aladdin

论坛徽章:
0
10 [报告]
发表于 2014-11-24 17:24 |只看该作者
感谢这么多热心朋友的回帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP