#include <iostream>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <sys/socket.h>
#include <unistd.h>
using namespace std;
#define MAX_EVENT_NUM 1024
int start_server() {
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
server_addr.sin_port = htons(8001);
bind(sockfd, (struct sockaddr*) &server_addr, sizeof(server_addr));
listen(sockfd, 100);
return sockfd;
}
void addfd(int epollfd, int fd) {
struct epoll_event event;
event.data.fd = fd;
event.events = EPOLLIN | EPOLLET;
epoll_ctl(epollfd, EPOLL_CTL_ADD, fd, &event);
}
void et(struct epoll_event *event, int num, int epollfd, int listenfd) {
char buf[1024];
for (int i = 0; i < num; i++) {
int sockfd = event[i].data.fd;
if (sockfd == listenfd) {
printf("新用户\n");
struct sockaddr_in clientaddr;
socklen_t clilen = sizeof(clientaddr);
int connfd = accept(listenfd, (struct sockaddr *) &clientaddr,
&clilen);
addfd(epollfd, connfd);
}
else {
printf("以前的用户\n");
}
}
}
int main(int argc, char **argv) {
int sockfd = start_server();
struct epoll_event events[MAX_EVENT_NUM];
int epollfd = epoll_create(10);
if (-1 == epollfd) {
perror("创建文件描述符失败");
return 0;
}
addfd(epollfd, sockfd);
while (1) {
int ret = epoll_wait(epollfd, events, MAX_EVENT_NUM, -1); //返回活跃用户个数
if (ret < 0) {
printf("epoll failure\n");
continue;
}
et(events, ret, epollfd, sockfd);
}
shutdown(sockfd, SHUT_RDWR);
return 0;
}