diff options
author | Guangxiong Lin <[email protected]> | 2022-12-01 23:20:33 +0800 |
---|---|---|
committer | Guangxiong Lin <[email protected]> | 2022-12-01 23:20:33 +0800 |
commit | a9501d10847d7993fad2e0778fe9c11317b4f7be (patch) | |
tree | 470302a8a27b460c7f1fc5411e9f8dac0707743f /server.c | |
parent | 122a69f715acfe73963a2347cbb335e41bce944c (diff) | |
download | tinyserver-a9501d10847d7993fad2e0778fe9c11317b4f7be.tar.gz tinyserver-a9501d10847d7993fad2e0778fe9c11317b4f7be.tar.bz2 tinyserver-a9501d10847d7993fad2e0778fe9c11317b4f7be.zip |
Simplify logic by structure
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 96 |
1 files changed, 64 insertions, 32 deletions
@@ -7,51 +7,83 @@ #include <stdio.h> #include <sys/types.h> #include <unistd.h> +#include <sys/epoll.h> +#include <errno.h> -#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)); + } } } } |