#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#define MAX_EVENTS 1024
#define PORT 8080
int main() {
int server_fd, new_socket, epoll_fd, num_ready;
struct sockaddr_in address;
char buffer[1024] = {0};
struct epoll_event event, events[MAX_EVENTS];
// 创建socket
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置socket选项
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {
perror("setsockopt failed");
exit(EXIT_FAILURE);
}
// 绑定socket到指定端口
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
perror("bind failed");
exit(EXIT_FAILURE);
}
// 监听socket
if (listen(server_fd, 3) < 0) {
perror("listen failed");
exit(EXIT_FAILURE);
}
// 创建epoll实例
if ((epoll_fd = epoll_create1(0)) < 0) {
perror("epoll_create1 failed");
exit(EXIT_FAILURE);
}
// 添加server_fd到epoll实例中
event.events = EPOLLIN;
event.data.fd = server_fd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, server_fd, &event) < 0) {
perror("epoll_ctl failed");
exit(EXIT_FAILURE);
}
while (1) {
// 等待事件发生
num_ready = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
if (num_ready < 0) {
perror("epoll_wait failed");
exit(EXIT_FAILURE);
}
for (int i = 0; i < num_ready; i++) {
if (events[i].data.fd == server_fd) {
// 有新的连接请求
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&address)) < 0) {
perror("accept failed");
exit(EXIT_FAILURE);
}
// 将新的socket添加到epoll实例中
event.events = EPOLLIN;
event.data.fd = new_socket;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, new_socket, &event) < 0) {
perror("epoll_ctl failed");
exit(EXIT_FAILURE);
}
} else {
// 有数据可读
int valread = read(events[i].data.fd, buffer, 1024);
if (valread == 0) {
// 客户端关闭连接
close(events[i].data.fd);
} else {
// 将数据回传给客户端
send(events[i].data.fd, buffer, strlen(buffer), 0);
}
}
}
}
return 0;
}
day2作业
最新推荐文章于 2024-09-16 10:32:48 发布
该C语言程序创建了一个TCP服务器,使用epoll进行多路复用,监听8080端口。当有新的连接请求时,服务器接受连接并将新socket添加到epoll实例中。服务器接收客户端数据并回传,处理多个并发连接。
摘要由CSDN通过智能技术生成