使用EPOLL 监听 UDP 接收的代码
时间: 2024-03-23 14:43:32 浏览: 19
好的,以下是一个使用EPOLL监听UDP接收的示例代码:
```
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#define MAX_EVENTS 10
int main() {
int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
struct sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = htonl(INADDR_ANY);
addr.sin_port = htons(8080);
bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
int epfd = epoll_create1(0);
struct epoll_event event, events[MAX_EVENTS];
event.data.fd = sockfd;
event.events = EPOLLIN;
epoll_ctl(epfd, EPOLL_CTL_ADD, sockfd, &event);
while (1) {
int n = epoll_wait(epfd, events, MAX_EVENTS, -1);
for (int i = 0; i < n; i++) {
if (events[i].data.fd == sockfd) {
char buffer[1024];
struct sockaddr_in client_addr;
socklen_t client_len = sizeof(client_addr);
int len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr *)&client_addr, &client_len);
printf("Received %d bytes from %s:%d\n", len, inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
}
}
}
close(epfd);
close(sockfd);
return 0;
}
```
这个示例代码与之前的示例代码非常相似,但使用了epoll_create1()函数来创建epoll实例,并设置了EPOLL_CLOEXEC标志,以在执行exec()函数时自动关闭epoll实例。在主循环中,我们调用epoll_wait()函数进行监听事件,如果UDP套接字有事件发生(EPOLLIN),则调用recvfrom()函数接收UDP数据包。与之前的示例代码相比,这个代码更加健壮和安全。