- 论坛徽章:
- 0
|
本帖最后由 jiangjkd 于 2014-03-17 11:36 编辑
主线程 就是创建一个 epoll_fd 并且把监听端口加入epoll事件列表:
epoll_fd = epoll_create(MAX_DESCRIPTORS);
if(epoll_fd == INVALID_SOCKET)
{
return false;
}
epoll_event ev;
memset(&ev, 0, sizeof(epoll_event));
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = m_listenFd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, m_listenFd, &ev) < 0)
{
return -1;
}
else
{
cout<<"监听 socket 加入 epoll 成功!"<<endl;
}
子线程1 循环调用epoll_wait 处理 接收连接 读写事件:
const static int maxevents = MAXEPOLLSIZE;
epoll_event events[MAXEPOLLSIZE];
int nfds, i;
SOCKET s;
while(m_running)
{
nfds = epoll_wait(epoll_fd, events, maxevents,-1);
for(i = 0; i < nfds; ++i)
{
if(events.data.fd == m_listenFd)
{
cout<<"Do Accept"<<endl;
DoAccept();
}
else
{
s = events.data.fd;
if(s == 0)
{
printf("epoll returned invalid fd %u\n", events.data.fd);
continue;
}
if(events.events & EPOLLHUP || events.events & EPOLLERR)
{
WantClose(s);
}
else if(events.events & EPOLLIN)
{
while(OnRecvTCPProc());
}
else if(events.events & EPOLLOUT)
{
while(OnSendTCPProc());
}
}
}
}
子线程2:
调用 epoll_ctl,EPOLL_CTL_DEL 来删除一个socket,结果导致程序崩溃,直接消失, 这是为什么?
struct epoll_event ev;
memset(&ev, 0, sizeof(epoll_event));
ev.data.fd = fd;
int ret = epoll_ctl(epoll_fd, EPOLL_CTL_DEL,fd, &ev);
epoll_ctl epoll_wait 只能在同一个线程中使用吗?
|
|