- 论坛徽章:
- 0
|
int Epollfd;
struct epoll_event ev, events[10000];
CPUB_EpollServer::CPUB_EpollServer()
{
pthread_mutex_init(&EPollMutex, NULL);
Epollfd = epoll_create(10000);
}
CPUB_EpollServer::~CPUB_EpollServer()
{
}
/*
*--------------------------------------------------------------------
*
* Functionname: int CPUB_EpollServer::Epoll_Wait
*
* Parameters: in) int Socket: socket 描述符
* in) int *EventSocket: 有事件的socket
*
* Description: 等待注册的socket事件的产生
*
* Return: FALSE
*
*--------------------------------------------------------------------
*/
int CPUB_EpollServer::Epoll_Wait(int Socket, int *EventSocket, int Currfds, int Time )
{
int ActiveFd = 0;
while(1)
{
ActiveFd = epoll_wait(Epollfd, events, Currfds, Time);
if( ActiveFd <= 0 )
{
continue;
}
for( int i = 0; i < ActiveFd; ++i )
{
if( events.data.fd == Socket)
{
*EventSocket = Socket;
return Socket;
}
else if( events.events&EPOLLERR )
{
*EventSocket = events.data.fd;
return EPOLLERR;
}
else if( events.events&EPOLLHUP )
{
*EventSocket = events.data.fd;
return EPOLLHUP;
}
else if( events.events&EPOLLIN )
{
*EventSocket = events.data.fd;
return EPOLLIN;
}
}
} //end while
return FALSE;
}
/*
*--------------------------------------------------------------------
*
* Functionname: int CPUB_EpollServer::Epoll_CtlADD
*
* Parameters: in) socket: Socket 描述符
*
* Description: 将socket描述符注册事件并加入到Epoll集合
*
* Return: 成功 TRUE 失败 FALSE
*
*--------------------------------------------------------------------
*/
int CPUB_EpollServer::Epoll_CtlADD(int Socket)
{
pthread_mutex_lock(&EPollMutex);
//struct epoll_event ev;
ev.data.fd = Socket;
ev.events = EPOLLERR|EPOLLIN|EPOLLHUP;
if (epoll_ctl(Epollfd, EPOLL_CTL_ADD, Socket, &ev) < 0)
{
printf("epoll add failed errno = %d str = %s\n", errno, strerror(errno));
pthread_mutex_unlock(&EPollMutex);
return FALSE;
}
pthread_mutex_unlock(&EPollMutex);
return TRUE;
}
/*
*--------------------------------------------------------------------
*
* Functionname: int CPUB_EpollServer::Epoll_CtlDEL(int Socket)
*
* Parameters: in) socket: Socket 描述符
*
* Description: 将Socket描述符从Epoll事件集合中删除
*
* Return: non
*
*--------------------------------------------------------------------
*/
void CPUB_EpollServer::Epoll_CtlDEL(int Socket)
{
pthread_mutex_lock(&EPollMutex);
//struct epoll_event ev;
epoll_ctl(Epollfd, EPOLL_CTL_DEL, Socket, &ev);
pthread_mutex_unlock(&EPollMutex);
}
我是一个线程调用 CPUB_EpollServer::Epoll_Wait(int Socket, int *EventSocket, int Currfds, int Time )
有可读事件,socket 加入到一个链表中,然后 调用 CPUB_EpollServer::Epoll_CtlDEL(int Socket)
其他某个线程取到socket 后并接收,接收完后调用 int CPUB_EpollServer::Epoll_CtlADD(int Socket)
但是int CPUB_EpollServer::Epoll_CtlADD(int Socket)总是 报错 即 < 0
if (epoll_ctl(Epollfd, EPOLL_CTL_ADD, Socket, &ev) < 0)
{
printf("epoll add failed errno = %d str = %s\n", errno, strerror(errno));
pthread_mutex_unlock(&EPollMutex);
return FALSE;
}
epoll add failed errno = 17 str = File exists
怎么回事 ? 怎么避免
?
[ 本帖最后由 齐得龙强更强 于 2009-9-29 15:46 编辑 ] |
|