epoll监控多个socket描述符的操作如何实现?

joseph_hsw 2014-02-18 04:31:20
譬如三个监听socket,对应会产生三个fd。求一个实际例子
是直接调动epoll_ctl,像下面这样?

epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd1,&ev);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd2,&ev);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd3,&ev);

然后
nfds = epoll_wait(epollFd, events, MAXEVENTS, 500);
if(nfds > 0)
{
for (i = 0; i < nfds; ++i)
{
switch(events.data.fd)
{
case sockFd1:
break;
case sockFd2:
break;
case sockFd3:
break;
}
}
}
...全文
540 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2014-02-18
  • 打赏
  • 举报
回复
引用 13 楼 u011339091 的回复:
[quote=引用 12 楼 luciferisnotsatan 的回复:] [quote=引用 11 楼 u011339091 的回复:] [quote=引用 10 楼 luciferisnotsatan 的回复:] 3个listen和1个listen,2个accpet,这本质上没什么区别。epoll_wait就是等3个fd的事件的产生
为什么会没有区别? 一个socket,listen,加入epoll,epoll_wait获取到事件fd,然后accept,这个流程只能针对一个端口的监听操作吧。 我不太理解你说的一个listen,2个accept是什么意思[/quote] 不清楚你找得是什么例子。一般不是accpet后,把这个socket也ADD进去一起监听么? http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html 难道你找到的是,accept后,直接对这个accept套接字read,write,然后close。不ADD?[/quote] 嗯,是的,accept之后直接read,不再add了[/quote] 那只能说你找的这个例子太简单了。。。。。。
joseph_hsw 2014-02-18
  • 打赏
  • 举报
回复
是我看代码不仔细,找到的资料add accept确实和我这个需求是一样的
joseph_hsw 2014-02-18
  • 打赏
  • 举报
回复
引用 12 楼 luciferisnotsatan 的回复:
[quote=引用 11 楼 u011339091 的回复:] [quote=引用 10 楼 luciferisnotsatan 的回复:] 3个listen和1个listen,2个accpet,这本质上没什么区别。epoll_wait就是等3个fd的事件的产生
为什么会没有区别? 一个socket,listen,加入epoll,epoll_wait获取到事件fd,然后accept,这个流程只能针对一个端口的监听操作吧。 我不太理解你说的一个listen,2个accept是什么意思[/quote] 不清楚你找得是什么例子。一般不是accpet后,把这个socket也ADD进去一起监听么? http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html 难道你找到的是,accept后,直接对这个accept套接字read,write,然后close。不ADD?[/quote] 嗯,是的,accept之后直接read,不再add了
luciferisnotsatan 2014-02-18
  • 打赏
  • 举报
回复
引用 11 楼 u011339091 的回复:
[quote=引用 10 楼 luciferisnotsatan 的回复:] 3个listen和1个listen,2个accpet,这本质上没什么区别。epoll_wait就是等3个fd的事件的产生
为什么会没有区别? 一个socket,listen,加入epoll,epoll_wait获取到事件fd,然后accept,这个流程只能针对一个端口的监听操作吧。 我不太理解你说的一个listen,2个accept是什么意思[/quote] 不清楚你找得是什么例子。一般不是accpet后,把这个socket也ADD进去一起监听么? http://www.cnblogs.com/Anker/archive/2013/08/17/3263780.html 难道你找到的是,accept后,直接对这个accept套接字read,write,然后close。不ADD?
joseph_hsw 2014-02-18
  • 打赏
  • 举报
回复
引用 10 楼 luciferisnotsatan 的回复:
3个listen和1个listen,2个accpet,这本质上没什么区别。epoll_wait就是等3个fd的事件的产生
为什么会没有区别? 一个socket,listen,加入epoll,epoll_wait获取到事件fd,然后accept,这个流程只能针对一个端口的监听操作吧。 我不太理解你说的一个listen,2个accept是什么意思
luciferisnotsatan 2014-02-18
  • 打赏
  • 举报
回复
3个listen和1个listen,2个accpet,这本质上没什么区别。epoll_wait就是等3个fd的事件的产生
luciferisnotsatan 2014-02-18
  • 打赏
  • 举报
回复
引用 8 楼 u011339091 的回复:
[quote=引用 7 楼 luciferisnotsatan 的回复:] [quote=引用 6 楼 u011339091 的回复:] 呵呵,没用过,找到的资料都是只有一个socket的情况。 所以不确定,谢谢楼上几位了。 我先试试
哪会有资料就一个sock,一般都是一个listen,然后accept添加。[/quote] 这不就是一个socket么,我现在是需要listen三个端口,所以建立了三个socket[/quote] accept返回的不也是socket描述符?这些fd描述符都一样的。
joseph_hsw 2014-02-18
  • 打赏
  • 举报
回复
引用 7 楼 luciferisnotsatan 的回复:
[quote=引用 6 楼 u011339091 的回复:] 呵呵,没用过,找到的资料都是只有一个socket的情况。 所以不确定,谢谢楼上几位了。 我先试试
哪会有资料就一个sock,一般都是一个listen,然后accept添加。[/quote] 这不就是一个socket么,我现在是需要listen三个端口,所以建立了三个socket
luciferisnotsatan 2014-02-18
  • 打赏
  • 举报
回复
引用 6 楼 u011339091 的回复:
呵呵,没用过,找到的资料都是只有一个socket的情况。 所以不确定,谢谢楼上几位了。 我先试试
哪会有资料就一个sock,一般都是一个listen,然后accept添加。
joseph_hsw 2014-02-18
  • 打赏
  • 举报
回复
呵呵,没用过,找到的资料都是只有一个socket的情况。 所以不确定,谢谢楼上几位了。 我先试试
joseph_hsw 2014-02-18
  • 打赏
  • 举报
回复
上面的错了。

epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd1,&ev1);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd2,&ev2);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd3,&ev3);
nfds = epoll_wait(epollFd, events, MAXEVENTS, 500);
if(nfds > 0)
{
        for (i = 0; i < nfds; ++i)         
        {
             switch(events[i].data.fd)
             {
                case sockFd1:
                    break;
                case sockFd2:
                    break;
                case sockFd3:
                    break;
              }
        }
}
ztenv 版主 2014-02-18
  • 打赏
  • 举报
回复
引用 3 楼 u011339091 的回复:
这样就没可以?

epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd1,&ev1);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd2,&ev2);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd3,&ev3);
nfds = epoll_wait(epollFd, events, MAXEVENTS, 500);
if(nfds > 0)
{
        for (i = 0; i < nfds; ++i)         
        {
             switch(events.data.fd)
             {
                case sockFd1:
                    break;
                case sockFd2:
                    break;
                case sockFd3:
                    break;
              }
        }
}
为什么不可以呢?
joseph_hsw 2014-02-18
  • 打赏
  • 举报
回复
这样就没可以?

epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd1,&ev1);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd2,&ev2);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd3,&ev3);
nfds = epoll_wait(epollFd, events, MAXEVENTS, 500);
if(nfds > 0)
{
        for (i = 0; i < nfds; ++i)         
        {
             switch(events.data.fd)
             {
                case sockFd1:
                    break;
                case sockFd2:
                    break;
                case sockFd3:
                    break;
              }
        }
}
  • 打赏
  • 举报
回复
ev1;
ev2;
ev3;
 
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd1,&ev1);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd2,&ev2);
epoll_ctl(epollFd,EPOLL_CTL_ADD,sockFd3,&ev3);
luciferisnotsatan 2014-02-18
  • 打赏
  • 举报
回复
有什么问题么?

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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