diff options
author | Guangxiong Lin <[email protected]> | 2022-12-02 12:18:57 +0800 |
---|---|---|
committer | Guangxiong Lin <[email protected]> | 2022-12-02 12:18:57 +0800 |
commit | 0457119acb36b89b6f2f4534fe8ad94b19540bbd (patch) | |
tree | 865660e935da9a4adc34f17237e7e83364b53fc6 /acceptor.c | |
parent | 6ec515e5515fbf529e3610a2c88116278af2a134 (diff) | |
download | tinyserver-0457119acb36b89b6f2f4534fe8ad94b19540bbd.tar.gz tinyserver-0457119acb36b89b6f2f4534fe8ad94b19540bbd.tar.bz2 tinyserver-0457119acb36b89b6f2f4534fe8ad94b19540bbd.zip |
Refactor
Diffstat (limited to 'acceptor.c')
-rw-r--r-- | acceptor.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/acceptor.c b/acceptor.c new file mode 100644 index 0000000..bb4fb88 --- /dev/null +++ b/acceptor.c @@ -0,0 +1,51 @@ +#include <stdbool.h> +#include <stdlib.h> +#include <stdio.h> + +#include "acceptor.h" +#include "util.h" +#include "connection.h" + +int connAcceptorAccept(struct connAcceptor *ca) +{ + struct tsocket *conn_sock = tsocketAccept(ca->sock); + if (conn_sock == NULL) { + perror("socket accept"); + return 0; + } + + if (setblocking(conn_sock->fd, false) == -1) { + perror("setblocking"); + tsocketDelete(conn_sock); + return 0; + } + + struct connection *conn = connectionNew(conn_sock); + struct event *conn_ev = connectionNewEvent(conn); + + if (eventLoopAdd(ca->el, conn_ev, EPOLLIN | EPOLLET) == -1) { + perror("eventloop add fd: conn_sock"); + return 0; + } + + printf("New client fd %d, ip: %s, port: %d\n", + conn_sock->fd, conn_sock->addr, conn_sock->port); + + return 0; +} + +void connAcceptorDel(struct connAcceptor *ca) +{ + tsocketDelete(ca->sock); + free(ca); +} + +struct event *connAcceptorNewEvent(struct tsocket *sock, struct eventLoop *el) +{ + struct connAcceptor *ca = malloc(sizeof(*ca)); + ca->sock = sock; + ca->el = el; + + struct event *ev = eventNew(ca, sock->fd, connAcceptorAccept, connectionDel); + return ev; +} |