免费注册 查看新帖 |

Chinaunix

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

epoll里的 recv 怎么设置读取超时? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-07 11:29 |只看该作者 |倒序浏览
int event_read(struct _conn *conn)
{
    int n;
    char *data;
    char buf[1024] = {0};

&nbsp;&nbsp;&nbsp;&nbsp;while ((n = read(conn->sfd, buf, 1024)) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (errno == EINTR)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;continue;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (errno != EAGAIN && errno != EWOULDBLOCK)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (!(conn->events & EPOLLIN))
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn->events = EPOLLIN | EPOLLERR | EPOLLHUP;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (_mod_conn(conn, conn->events) < 0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return -1;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;return n;
}

int main()
{
&nbsp;&nbsp;&nbsp;&nbsp;for(;;)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;num = eph_read(conn);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(num <= 0) break;
&nbsp;&nbsp;&nbsp;&nbsp;}
}





我用epoll来作Web server 当IE  POST一个比较大的数据。epoll 服务器需要多次recv数据。可每次recv最后一个事件的时候。recv就一直处于堵塞的状态。

不知道为什么.我已经设置了sockfd为 非堵塞.

需要给recv设置个读取超时吗? 应该怎么设置?

论坛徽章:
0
2 [报告]
发表于 2008-01-07 11:57 |只看该作者
为什么用了epoll还要要阻塞io?

论坛徽章:
0
3 [报告]
发表于 2008-01-07 12:11 |只看该作者
那我肯定得循环读取数据。

论坛徽章:
0
4 [报告]
发表于 2008-01-07 13:50 |只看该作者
给sockfd设置非阻塞
如果有EPOLLIN事件 , 一直读数据直到读到EAGAIN
然后退去读....

论坛徽章:
0
5 [报告]
发表于 2008-01-07 14:40 |只看该作者
现在也是这么做的啊

论坛徽章:
0
6 [报告]
发表于 2008-01-07 15:13 |只看该作者
你代码的流程好象有点问题...
应该是
while(1)
{
    int nRet= epoll_wait();
    for(i=0; i<nRet; i++)
    {
      if(EPOLLIN)
      {
          ///读数据直到读EAGIN
      }
     }
}

论坛徽章:
0
7 [报告]
发表于 2008-01-07 16:39 |只看该作者
我也是这么做的。
中间步骤省略了,没写出来

论坛徽章:
0
8 [报告]
发表于 2008-01-07 18:08 |只看该作者
原帖由 我要思考 于 2008-1-7 16:39 发表
我也是这么做的。
中间步骤省略了,没写出来



那就把代码贴全的吧 , 大家好帮助你看看....
看你这段代码
while ((n = read(conn->sfd, buf, 1024)) < 0)
    {
        if (errno == EINTR)
            continue;
        if (errno != EAGAIN && errno != EWOULDBLOCK)
            return -1;
        if (!(conn->events & EPOLLIN))
        {
            conn->events = EPOLLIN | EPOLLERR | EPOLLHUP;
            if (_mod_conn(conn, conn->events) < 0)
            {
                return -1;
            }
        }
    }
好象不是这个流程吧.......

论坛徽章:
0
9 [报告]
发表于 2008-01-07 18:44 |只看该作者
我已经搞定了。
把content_length和已读取的量 比较一下就可以了

论坛徽章:
0
10 [报告]
发表于 2008-01-07 22:36 |只看该作者
epoll 无法超时返回

如果连接正确,而无数据过来 你就吊死在上面吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP