C语言epoll轮询方式实现Web Server - 高效网络编程示例
#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <sys/epoll.h>\n#include <sys/socket.h>\n#include <arpa/inet.h>\n\n#define MAX_EVENTS 10\n#define BUF_SIZE 1024\n\nint main() {\n int server_fd, client_fd, epoll_fd, event_count, i;\n struct sockaddr_in server_addr, client_addr;\n struct epoll_event event, events[MAX_EVENTS];\n char buf[BUF_SIZE];\n \n // 创建socket\n if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {\n perror("socket");\n exit(1);\n }\n \n // 设置服务器地址\n server_addr.sin_family = AF_INET;\n server_addr.sin_port = htons(8080);\n server_addr.sin_addr.s_addr = htonl(INADDR_ANY);\n \n // 绑定socket到服务器地址\n if (bind(server_fd, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1) {\n perror("bind");\n exit(1);\n }\n \n // 监听socket\n if (listen(server_fd, 10) == -1) {\n perror("listen");\n exit(1);\n }\n \n // 创建epoll实例\n if ((epoll_fd = epoll_create1(0)) == -1) {\n perror("epoll_create1");\n exit(1);\n }\n \n // 添加server_fd到epoll实例中\n event.events = EPOLLIN;\n event.data.fd = server_fd;\n if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_fd, &event) == -1) {\n perror("epoll_ctl");\n exit(1);\n }\n \n while (1) {\n // 等待事件发生\n event_count = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);\n if (event_count == -1) {\n perror("epoll_wait");\n exit(1);\n }\n \n // 处理所有事件\n for (i = 0; i < event_count; i++) {\n // 如果是服务器socket上的事件,表示有新的客户端连接\n if (events[i].data.fd == server_fd) {\n socklen_t client_addr_len = sizeof(client_addr);\n // 接受新的客户端连接\n if ((client_fd = accept(server_fd, (struct sockaddr *)&client_addr, &client_addr_len)) == -1) {\n perror("accept");\n exit(1);\n }\n \n // 将新的客户端连接添加到epoll实例中\n event.events = EPOLLIN;\n event.data.fd = client_fd;\n if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client_fd, &event) == -1) {\n perror("epoll_ctl");\n exit(1);\n }\n }\n // 如果是客户端socket上的事件,表示有数据可读\n else {\n // 读取客户端发来的数据\n int bytes_read = read(events[i].data.fd, buf, BUF_SIZE);\n if (bytes_read == -1) {\n perror("read");\n exit(1);\n }\n else if (bytes_read == 0) {\n // 客户端关闭连接\n close(events[i].data.fd);\n }\n else {\n // 发送响应给客户端\n const char *response = "HTTP/1.1 200 OK\r\nContent-Length: 12\r\n\r\nHello World!";\n if (write(events[i].data.fd, response, strlen(response)) == -1) {\n perror("write");\n exit(1);\n }\n }\n }\n }\n }\n \n close(server_fd);\n return 0;\n}\n
原文地址: https://www.cveoy.top/t/topic/pSAt 著作权归作者所有。请勿转载和采集!