#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;
}