#pragma once #include #ifndef __linux__ #define NOEPOLL #endif #ifdef _WIN32 #include #define poll(fds, cnt, to) WSAPoll(fds, cnt, to) #define close(fd) closesocket(fd) #else #include #include #ifndef NOEPOLL #include #define POLLIN EPOLLIN #define POLLOUT EPOLLOUT #define POLLERR EPOLLERR #define POLLHUP EPOLLHUP #define POLLRDHUP EPOLLRDHUP #else #include #endif #endif #ifndef POLLRDHUP #define POLLRDHUP POLLHUP #endif enum eid { EV_ACCEPT, EV_REQUEST, EV_CONNECT, EV_IGNORE, EV_TUNNEL, EV_PRE_TUNNEL, EV_UDP_TUNNEL, EV_DESYNC }; #define FLAG_S4 1 #define FLAG_S5 2 #define FLAG_CONN 4 #ifdef EID_STR char *eid_name[] = { "EV_ACCEPT", "EV_REQUEST", "EV_CONNECT", "EV_IGNORE", "EV_TUNNEL", "EV_PRE_TUNNEL", "EV_UDP_TUNNEL", "EV_DESYNC" }; #endif struct buffer { ssize_t size; int offset; char *data; }; struct eval { int fd; int index; enum eid type; struct eval *pair; struct buffer buff; int flag; union { struct sockaddr_in in; struct sockaddr_in6 in6; }; ssize_t recv_count; int attempt; char cache; #ifndef NOEPOLL uint32_t events; #endif unsigned int del_iter; }; struct poolhd { int max; int count; int efd; struct eval **links; struct eval *items; #ifndef NOEPOLL struct epoll_event *pevents; #else struct pollfd *pevents; #endif unsigned int iters; }; struct poolhd *init_pool(int count); struct eval *add_event(struct poolhd *pool, enum eid type, int fd, int e); struct eval *add_pair(struct poolhd *pool, struct eval *val, int sfd, int e); void del_event(struct poolhd *pool, struct eval *val); void destroy_pool(struct poolhd *pool); struct eval *next_event(struct poolhd *pool, int *offs, int *type); int mod_etype(struct poolhd *pool, struct eval *val, int type, char rm);