哈希空间
写一个c语言使用epoll的例子代码
以下是一个使用epoll的简单示例,可以在Linux上运行:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MAX_EVENTS 10
int main() {
int listen_sock, conn_sock, nfds, epollfd;
struct epoll_event ev, events[MAX_EVENTS];
struct sockaddr_in addr;
socklen_t addrlen = sizeof(addr);
char buffer[256];
// 创建监听套接字
if ((listen_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
perror("socket");
exit(EXIT_FAILURE);
}
// 绑定地址和端口
addr.sin_family = AF_INET;
addr.sin_addr.s_addr = INADDR_ANY;
addr.sin_port = htons(12345);
if (bind(listen_sock, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
perror("bind");
exit(EXIT_FAILURE);
}
// 开始监听连接
if (listen(listen_sock, 1) < 0) {
perror("listen");
exit(EXIT_FAILURE);
}
// 创建epoll实例
if ((epollfd = epoll_create1(0)) < 0) {
perror("epoll_create1");
exit(EXIT_FAILURE);
}
// 添加监听套接字到epoll实例中
ev.events = EPOLLIN;
ev.data.fd = listen_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, listen_sock, &ev) < 0) {
perror("epoll_ctl: listen_sock");
exit(EXIT_FAILURE);
}
// 循环等待事件发生
while (1) {
// 等待事件发生
if ((nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1)) < 0) {
perror("epoll_wait");
exit(EXIT_FAILURE);
}
// 处理事件
for (int i = 0; i < nfds; i++) {
if (events[i].data.fd == listen_sock) {
// 有新连接请求
if ((conn_sock = accept(listen_sock, (struct sockaddr*)&addr, &addrlen)) < 0) {
perror("accept");
exit(EXIT_FAILURE);
}
printf("New connection from %s:%d\n", inet_ntoa(addr.sin_addr), ntohs(addr.sin_port));
// 添加新连接套接字到epoll实例中
ev.events = EPOLLIN;
ev.data.fd = conn_sock;
if (epoll_ctl(epollfd, EPOLL_CTL_ADD, conn_sock, &ev) < 0) {
perror("epoll_ctl: conn_sock");
exit(EXIT_FAILURE);
}
} else {
// 有数据可读
int n = read(events[i].data.fd, buffer, sizeof(buffer));
if (n <= 0) {
// 连接关闭或出错
printf("Connection closed\n");
close(events[i].data.fd);
} else {
// 打印收到的数据
printf("Received %d bytes: %.*s\n", n, n, buffer);
}
}
}
}
return 0;
}
这个示例程序创建一个TCP监听套接字,并使用epoll机制来等待连接请求和数据读取事件。当有新连接请求时,程序会接受连接并将新连接套接字添加到epoll实例中。当有数据可读时,程序会读取数据并打印收到的内容。当连接关闭时,程序会从epoll实例中删除该连接套接字。
本文 最佳观看地址:https://www.hashspace.cn/c-epoll-example.html 阅读 1268