首先,使用epoll_create创建一个句柄:
g_epollFd = epoll_create(MAX_EVENTS);
定义一个结构:
typedef struct send_event
{
int fdRecv;
struct sockaddr_in RecvAddr;
} Recv_Event;
使用epoll_ctl将Udp句柄加入到epoll:
Recv_Event *pEvent = (Recv_Event*)malloc(sizeof( Recv_Event));
pEvent->fdRecv =socket(AF_INET,SOCK_DGRAM,0);
pEvent->RecvAddr.sin_family=AF_INET;
pEvent->RecvAddr.sin_port=8888;
bind(pEvent->fdRecv ,(struct sockaddr *)&pEvent->RecvAddr,sizeof(struct sockaddr));
struct epoll_event epv = {0};
epv.data.ptr =pEvent;
int op =EPOLL_CTL_ADD;
epv.events=EPOLLIN ;
epoll_ctl(g_epollFd, op, pEvent->fdRecv, &epv);
在线程中,使用epoll_wait来接收数据:
struct epoll_event events[MAX_EVENTS]; int SenderAddrSize = sizeof(struct sockaddr_in); while(1) { int fds = epoll_wait(g_epollFd, events, MAX_EVENTS, 0); if (fds ==-1) return 0; if (fds ==0) { usleep(1); continue; } int i =0; for(i = 0; i < fds; i++) { Recv_Event *event = (Send_Event*)events[i].data.ptr; char buffer[BUFFER_SIZE]; short len =0; len = recvfrom(event ->fdRecv, buffer, BUFFER_SIZE, MSG_DONTWAIT,(struct sockaddr *)&event ->RecvAddr,(socklen_t*)&SenderAddrSize); } } ok,可以使用epoll来接收udp数据了