LInux下C语言使用epoll建立服务器
时间: 2023-05-12 22:06:47 浏览: 145

linux下使用epoll技术制作大并发服务器(比如一个游戏房间能同时进来1千人)的实现 附源代码
可以使用epoll函数来实现高效的I/O多路复用,从而建立一个高性能的服务器。以下是一个简单的示例代码:
```
#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 10
int main(int argc, char *argv[]) {
int listen_fd, conn_fd, epoll_fd, nfds, n, i;
struct sockaddr_in serv_addr, cli_addr;
socklen_t cli_len = sizeof(cli_addr);
struct epoll_event ev, events[MAX_EVENTS];
// 创建监听套接字
if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket error");
exit(EXIT_FAILURE);
}
// 设置地址重用
int optval = 1;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &optval, sizeof(optval));
// 绑定地址
memset(&serv_addr, 0, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
serv_addr.sin_port = htons(8080);
if (bind(listen_fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1) {
perror("bind error");
exit(EXIT_FAILURE);
}
// 监听
if (listen(listen_fd, 10) == -1) {
perror("listen error");
exit(EXIT_FAILURE);
}
// 创建epoll实例
if ((epoll_fd = epoll_create1(0)) == -1) {
perror("epoll_create1 error");
exit(EXIT_FAILURE);
}
// 添加监听套接字到epoll实例中
ev.events = EPOLLIN;
ev.data.fd = listen_fd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, listen_fd, &ev) == -1) {
perror("epoll_ctl error");
exit(EXIT_FAILURE);
}
// 循环等待事件
while (1) {
nfds = epoll_wait(epoll_fd, events, MAX_EVENTS, -1);
if (nfds == -1) {
perror("epoll_wait error");
exit(EXIT_FAILURE);
}
// 处理所有事件
for (i = 0; i < nfds; i++) {
if (events[i].data.fd == listen_fd) {
// 有新连接
conn_fd = accept(listen_fd, (struct sockaddr *)&cli_addr, &cli_len);
if (conn_fd == -1) {
perror("accept error");
exit(EXIT_FAILURE);
}
// 将新连接添加到epoll实例中
ev.events = EPOLLIN;
ev.data.fd = conn_fd;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, conn_fd, &ev) == -1) {
perror("epoll_ctl error");
exit(EXIT_FAILURE);
}
} else {
// 有数据可读
char buf[1024];
n = read(events[i].data.fd, buf, sizeof(buf));
if (n == -1) {
perror("read error");
exit(EXIT_FAILURE);
} else if (n == 0) {
// 连接关闭
if (epoll_ctl(epoll_fd, EPOLL_CTL_DEL, events[i].data.fd, NULL) == -1) {
perror("epoll_ctl error");
exit(EXIT_FAILURE);
}
close(events[i].data.fd);
} else {
// 回显数据
if (write(events[i].data.fd, buf, n) == -1) {
perror("write error");
exit(EXIT_FAILURE);
}
}
}
}
}
return 0;
}
```
这个示例代码使用epoll实现了一个简单的回显服务器,可以在Linux下编译运行。
阅读全文
相关推荐















