免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1916 | 回复: 4

[其他] epoll 挺混乱的, 不知是不是水平不够 [复制链接]

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2015-12-08 10:53 |显示全部楼层

主要指先加入epoll后再异步connect, 目前发现的情况有:
1. connect 返回 EINPrOGRESS,  然后 epollout 单独被触发指示连接成功, 这是正常情况
2. connect 返回 EINPrOGRESS, 而后 epollhup | epollout 被触发, 据说是连接失败, 但其实是连接成功了,  此时检查 getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len); 会发现error == 0.  你要当失败处理, 那就有可能不断重连, 不断触发  epollhup | epollout, 直到某次狗屎运单独返回 epollout而没有 epollhup,
3.  connect 返回其他错误, 比如netunreach 之类,  而后 epollhup | epollout 被触发, 此时是连接失败了, 因为你若读写此fd会失败, 但此时检查 getsockopt(fd, SOL_SOCKET, SO_ERROR, &error, &len); 会发现error == 0, 意思是连接成功。

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
发表于 2015-12-08 10:56 |显示全部楼层
本帖最后由 hanxin83 于 2015-12-08 11:01 编辑

补充一个, 异步connect还会直接返回成功....(在连接本机IP的情况下)
PS, 没碰到过EPOLLHUP|EPOLLOUT楼主的情况.......
  1.        +--------------------------------------------------------------------------+
  2.        |                               I/O events                                 |
  3.        +-----------+-----------+--------------------------------------------------+
  4.        |Event      | Poll flag | Occurrence                                       |
  5.        +-----------+-----------+--------------------------------------------------+
  6.        |Read       | POLLIN    | New data arrived.                                |
  7.        +-----------+-----------+--------------------------------------------------+
  8.        |Read       | POLLIN    | A connection setup has been completed (for  con- |
  9.        |           |           | nection-oriented sockets)                        |
  10.        +-----------+-----------+--------------------------------------------------+
  11.        |Read       | POLLHUP   | A  disconnection  request  has been initiated by |
  12.        |           |           | the other end.                                   |
  13.        +-----------+-----------+--------------------------------------------------+
  14.        |Read       | POLLHUP   | A connection is broken (only for connection-ori- |
  15.        |           |           | ented  protocols).   When  the socket is written |
  16.        |           |           | SIGPIPE is also sent.                            |
  17.        +-----------+-----------+--------------------------------------------------+
  18.        |Write      | POLLOUT   | Socket has enough send buffer space for  writing |
  19.        |           |           | new data.                                        |
  20.        +-----------+-----------+--------------------------------------------------+
  21.        |Read/Write | POLLIN|   | An outgoing connect(2) finished.                 |
  22.        |           | POLLOUT   |                                                  |
  23.        +-----------+-----------+--------------------------------------------------+
  24.        |Read/Write | POLLERR   | An asynchronous error occurred.                  |
  25.        +-----------+-----------+--------------------------------------------------+
  26.        |Read/Write | POLLHUP   | The other end has shut down one direction.       |
  27.        +-----------+-----------+--------------------------------------------------+
  28.        |Exception  | POLLPRI   | Urgent data arrived.  SIGURG is sent then.       |
  29.        +-----------+-----------+--------------------------------------------------+
复制代码

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
发表于 2015-12-08 11:01 |显示全部楼层
本帖最后由 zylthinking 于 2015-12-08 11:02 编辑
hanxin83 发表于 2015-12-08 10:56
补充一个, 异步connect还会直接返回成功....(在连接本机IP的情况下)


这个可以理解, 属于异步connect本身就有的语意
恼火的在于用 epollhup 断定connect 失败不靠谱, 用SO_ERROR判断是否失败也不靠谱; 用两者结合, 还是不靠谱; EPOLLHUP有的时候有, 有的时候没有, 也搞不明白有什么规律

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:032015年亚洲杯之中国
日期:2015-04-22 15:52:45
发表于 2015-12-08 11:02 |显示全部楼层
我的世界比较单纯, 基本上只碰到man手册里的情况

论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
发表于 2015-12-08 12:50 |显示全部楼层
楼主的世界过于复杂
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP