aboutsummaryrefslogtreecommitdiff
path: root/server.c
diff options
context:
space:
mode:
authorGuangxiong Lin <[email protected]>2022-12-01 23:20:33 +0800
committerGuangxiong Lin <[email protected]>2022-12-01 23:20:33 +0800
commita9501d10847d7993fad2e0778fe9c11317b4f7be (patch)
tree470302a8a27b460c7f1fc5411e9f8dac0707743f /server.c
parent122a69f715acfe73963a2347cbb335e41bce944c (diff)
downloadtinyserver-a9501d10847d7993fad2e0778fe9c11317b4f7be.tar.gz
tinyserver-a9501d10847d7993fad2e0778fe9c11317b4f7be.tar.bz2
tinyserver-a9501d10847d7993fad2e0778fe9c11317b4f7be.zip
Simplify logic by structure
Diffstat (limited to 'server.c')
-rw-r--r--server.c96
1 files changed, 64 insertions, 32 deletions
diff --git a/server.c b/server.c
index 63f3062..1e3ad68 100644
--- a/server.c
+++ b/server.c
@@ -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));
+ }
}
}
}