From a9501d10847d7993fad2e0778fe9c11317b4f7be Mon Sep 17 00:00:00 2001 From: Guangxiong Lin Date: Thu, 1 Dec 2022 23:20:33 +0800 Subject: Simplify logic by structure --- server.c | 96 ++++++++++++++++++++++++++++++++++++++++++---------------------- 1 file changed, 64 insertions(+), 32 deletions(-) (limited to 'server.c') diff --git a/server.c b/server.c index 63f3062..1e3ad68 100644 --- a/server.c +++ b/server.c @@ -7,51 +7,83 @@ #include #include #include +#include +#include -#include "common.h" +#include "eventloop.h" +#include "tsocket.h" +#include "util.h" + +#define READ_BUFFER_SIZE 1024 + +void handleEvent(struct tsocket *sock) +{ + char buf[READ_BUFFER_SIZE]; + ssize_t n_read_bytes; + + for (;;) { + n_read_bytes = read(sock->fd, buf, sizeof(buf)); + if (n_read_bytes > 0) { + printf("message from conn %d: %s\n", sock->fd, buf); + write(sock->fd, buf, sizeof(buf)); + } else if (n_read_bytes == 0) { + printf("conn %d disconnected\n", sock->fd); + tsocketDelete(sock); + break; + } else if (n_read_bytes == -1) { + if (errno == EAGAIN || errno == EWOULDBLOCK) + break; + } + } +} int main() { - int sockfd = socket(AF_INET, SOCK_STREAM, 0); - if (sockfd == -1) + struct tsocket *sock = tsocketNew(); + if (sock == NULL) panic("socket creation error"); - struct sockaddr_in serv_addr; - bzero(&serv_addr, sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); - serv_addr.sin_port = htons(8888); - - if (bind(sockfd, (struct sockaddr*)&serv_addr, sizeof(serv_addr)) == -1) + if (tsocketBind(sock, "127.0.0.1", 8888) == -1) panic("socket bind error"); - if (listen(sockfd, SOMAXCONN) == -1) + if (tsocketListen(sock) == -1) panic("socket listen error"); - struct sockaddr_in clnt_addr; - socklen_t clnt_addr_len = sizeof(clnt_addr); - bzero(&clnt_addr, sizeof(clnt_addr)); + struct eventLoop *el = eventLoopNew(); + if (el == NULL) + panic("eventloop creation"); - int clnt_sockfd = accept(sockfd, (struct sockaddr *)&clnt_addr, &clnt_addr_len); - if (clnt_sockfd == -1) - panic("socket accept error"); + if (eventLoopAddSocket(el, sock, EPOLLIN) == -1) + panic("eventloop add fd"); - printf("New client fd %d, ip: %s, port: %d\n", clnt_sockfd, inet_ntoa(clnt_addr.sin_addr), ntohs(clnt_addr.sin_port)); + int nfds; + struct tsocket *conn_sock; + for (;;) { + nfds = eventLoopWait(el, -1); + if (nfds == -1) + panic("eventloop wait"); - while (true) { - char buf[1024]; - bzero(&buf, sizeof(buf)); - ssize_t n_read_bytes = read(clnt_sockfd, buf, sizeof(buf)); - if (n_read_bytes > 0) { - printf("message from client fd %d: %s\n", clnt_sockfd, buf); - write(clnt_sockfd, buf, sizeof(buf)); - } else if (n_read_bytes == 0) { - printf("client fd %d disconnected\n", clnt_sockfd); - close(clnt_sockfd); - break; - } else if (n_read_bytes == -1) { - close(clnt_sockfd); - panic("socket read error"); + for (int i = 0; i < nfds; i++) { + if (eventLoopGetSocket(el, i) == sock) { + conn_sock = tsocketAccept(sock); + if (conn_sock == NULL) + panic("socket accept error"); + + printf("New client fd %d, ip: %s, port: %d\n", + conn_sock->fd, conn_sock->addr, conn_sock->port); + + if (setblocking(conn_sock->fd, false) == -1) { + close(conn_sock->fd); + continue; + } + + if (eventLoopAddSocket(el, conn_sock, EPOLLIN | EPOLLET) == -1) + panic("eventloop add fd: conn_sockfd"); + + tsocketDelete(conn_sock); + } else { + handleEvent(eventLoopGetSocket(el, i)); + } } } } -- cgit v1.2.3