免费注册 查看新帖 |

Chinaunix

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

请教一个EPOLL有关的问题。监听多个端口 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-10 11:36 |只看该作者 |倒序浏览
最近看了下epoll,按照epoll模型写了一个测试程序。监听一个端口,处理大量链接 。
接下来,我就想,同时监听多个端口。
我将创建好的socket_fd存储在数组sock_fd[]中。
我想请教一下,接下来我该怎么做呢。

论坛徽章:
0
2 [报告]
发表于 2008-07-10 11:43 |只看该作者
把每个监听的套接字调用
struct epoll_event ev;
    bzero(&ev , sizeof(ev));
    ev.events = EPOLLIN | EPOLLET | EPOLLPRI | EPOLLERR;
    ev.data.fd = fd;

    if(epoll_ctl(epfd , EPOLL_CTL_ADD , fd , &ev)<0)
    {
        return false;
    }

然后再epoll_wait() 等代client的连接...........

论坛徽章:
0
3 [报告]
发表于 2008-07-10 11:55 |只看该作者
原帖由 ruchong 于 2008-7-10 11:43 发表
把每个监听的套接字调用
struct epoll_event ev;
    bzero(&ev , sizeof(ev));
    ev.events = EPOLLIN | EPOLLET | EPOLLPRI | EPOLLERR;
    ev.data.fd = fd;

    if(epoll_ctl(epfd , EPOLL_CTL_ ...

我现在是这么做了一下
sock_fd[max]
for(i=0;i<count;i++)
{
    ev.events=EPOLLIN|EPOLLET;
    if(epoll_ctl(epfd,EPOLL_CTL_ADD,sock_fd,&ev)<0)
    {
         perror("epoll_ctl";
         return -1;
    }
}

for(;
{
    nfds=epoll_wait(epfd,events,256,500);
    for(n=0;n<nfds;++n)
    {
            //在这里我该如何处理已经加入ev的fd呢
            //
     }
}

论坛徽章:
0
4 [报告]
发表于 2008-07-10 12:15 |只看该作者
epoll_event 里面有个64位东西,拆开用 32位保存fd  32位保存标识.....
还可以 Per IO Data

我的Smarthttpd里面就是这么用的,可以Listen多个端口

论坛徽章:
0
5 [报告]
发表于 2008-07-10 13:03 |只看该作者

回复 #3 Marsduan 的帖子

int nfds = epoll_wait(epfd , events , 100 , -1);
    for(int i=0; i<nfds; i++)
    {
        for(int j=0; j<queSockfd.size(); j++)
        {
            fd = queSockfd[j];
            if(fd == events.data.fd)
            {
                ///指定套接口上的连接
                break;
            }
        }

论坛徽章:
0
6 [报告]
发表于 2008-07-10 13:34 |只看该作者

回复 #5 ruchong 的帖子

不用遍历啊

论坛徽章:
0
7 [报告]
发表于 2008-07-10 13:41 |只看该作者

回复 #6 aoegiss 的帖子

不遍历好像不知道那个套接字上的连接.....

论坛徽章:
0
8 [报告]
发表于 2008-07-10 13:55 |只看该作者
原帖由 aoegiss 于 2008-7-10 12:15 发表
epoll_event 里面有个64位东西,拆开用 32位保存fd  32位保存标识.....
还可以 Per IO Data

我的Smarthttpd里面就是这么用的,可以Listen多个端口



typedef union epoll_data {
void *ptr;
int fd;
__uint32_t u32;
__uint64_t u64;
} epoll_data_t;

你说的是__uint32_t u32吗?
具体怎么做的呢?

论坛徽章:
0
9 [报告]
发表于 2008-07-10 14:25 |只看该作者

回复 #5 ruchong 的帖子

我现在这样做的
sock_fd[max]
for(i=0;i<count;i++)
{
    ev.events=EPOLLIN|EPOLLET;
    if(epoll_ctl(epfd,EPOLL_CTL_ADD,sock_fd,&ev)<0)
    {
         perror("epoll_ctl";
         return -1;
    }
}

for(;
{
    nfds=epoll_wait(epfd,events,256,500);
    for(n=0;n<nfds;++n)
    {
           for(int j =0;j<count;j++)
           {
                 new_fd=sock_fd;
                 if(new_fd==events[n].data.fd)
                  {
                        int test_fd=accept(new_fd,(struct sockaddr *)&CLI,&len);
                         ev.events=EPOLLIN|EPOLLET;
                           setnonblock(new_fd);
                          ev.data.fd=test_fd;
                         epoll_ctl(epfd,EPOLL_CTL_ADD,test_fd,&ev);
                    }
                   else if(events.events & EPOLLIN)
                  {
                          int ret=recv(events[n].data.fd,buf,MAXBUFF,0);
                          if(ret < 0 )
                              perror("recv");
                         if(ret》0)
                      …………
                 if(ret == 0)
                            ………………
                  }
            }
     }
}


运行测试,报错,recv: socket operation on non-socket

论坛徽章:
0
10 [报告]
发表于 2008-07-10 14:30 |只看该作者
应该是
new_fd=sock_fd[j]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP