#include #include #include #include #include "acceptor.h" #include "util.h" #include "connection.h" #include "evloop.h" #include "server.h" struct conn_acceptor { tsocket_t *sock; evloop_t **evloops; int nevloops; }; conn_acceptor_t *conn_acceptor_create(tsocket_t *sock, evloop_t **evloops, int nevloops) { conn_acceptor_t *acceptor = malloc(sizeof(*acceptor)); if (!acceptor) return NULL; acceptor->sock = sock; acceptor->evloops = evloops; acceptor->nevloops = nevloops; return acceptor; } static void conn_acceptor_accept(conn_acceptor_t *ca) { struct tsocket *conn_sock = tsocket_accept(ca->sock); if (conn_sock == NULL) { perror("socket accept"); return; } if (setblocking(conn_sock->fd, false) == -1) { perror("setblocking"); tsocket_destroy(conn_sock); return; } event_t *conn_ev = connection_create_event(conn_sock); // TODO: Use a better way to decide which sub reactor to use. int ind = conn_sock->fd % ca->nevloops; if (evloop_add(ca->evloops[ind], conn_ev, EPOLLIN | EPOLLET) == -1) { perror("eventloop add fd: conn_sock"); return; } printf("New client fd %d, ip: %s, port: %d\n", conn_sock->fd, conn_sock->addr, conn_sock->port); } static void conn_acceptor_destroy(conn_acceptor_t *ca) { tsocket_destroy(ca->sock); free(ca); } event_t *conn_acceptor_event_create(struct tsocket *sock, evloop_t **evloops, int nevloops) { conn_acceptor_t *acceptor = conn_acceptor_create(sock, evloops, nevloops); event_t *ev = event_create(acceptor, sock->fd, (evloop_process_func_t) conn_acceptor_accept, (evloop_destroy_func_t) conn_acceptor_destroy); return ev; }