From 9e180ec16a519b252e00f94f533227a48ac6665e Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Mon, 24 Jul 2023 12:39:11 -0500 Subject: server: fixed a timeout bug in session control Fixed a bug inside the session control logic that disallowed a timeout value. Signed-off-by: Danny Holman --- server/include/server.h | 2 ++ server/src/server.c | 37 +++++++++++++++++++++++++++++++------ server/src/session.c | 4 ++-- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/server/include/server.h b/server/include/server.h index b8f4fd7..3b39d72 100644 --- a/server/include/server.h +++ b/server/include/server.h @@ -6,6 +6,8 @@ void* control_listener(void *port); void* control_worker(void *sock_desc); +int ping_pong(int sock); + void* listener(void *port); void* worker(void *sock_desc); diff --git a/server/src/server.c b/server/src/server.c index ea37a72..bf2ed25 100644 --- a/server/src/server.c +++ b/server/src/server.c @@ -3,6 +3,8 @@ #include #include +pthread_mutex_t sock_mutex; + void* listener(void *port) { uint16_t port_num = *(int*)port; int server_sock = socket(PF_INET, SOCK_STREAM, 0); @@ -33,15 +35,38 @@ void* listener(void *port) { return 0; } +int ping_pong(int sock) { + int ret = 0; + char buffer[6]; + memset(buffer, 0, 6); + + pthread_mutex_lock(&sock_mutex); + if (output_pump(sock, "PING\r\n", 6) != -1) + ret = -1; + if (input_pump(sock, buffer, 6) == -1) + ret = -1; + if (strncmp(buffer, "PONG\r\n", 6) != 0) + ret = -1; + pthread_mutex_unlock(&sock_mutex); + + return ret; +} + void* worker(void *sock_desc) { int sock = *(int*)sock_desc; fcntl(sock, F_SETFL, fcntl(sock, F_GETFL, 0) & O_NONBLOCK); + pthread_mutex_init(&sock_mutex, NULL); struct session *ses = find_session(init_session(sock)); log_msg(LOG_INFO, "New session created with ID=%d\n", ses->id); - // TODO: have this thread actually do something - while (ses->alive == 1); + time_t start = time(NULL); + time_t diff; + while (ses->alive != 0) { + diff = time(NULL) - start; + if (ses->alive == 1 && diff != 0 && diff % 60 == 0) + ping_pong(sock); + } return 0; } @@ -49,11 +74,11 @@ void* worker(void *sock_desc) { ssize_t output_pump(int sock, char *buffer, size_t sz) { struct pollfd pfd[1]; pfd[0].fd = sock; - pfd[0].events = POLLIN; - int status = poll(pfd, 1, 15000); + pfd[0].events = POLLOUT; + int status = poll(pfd, 1, 10000); if (status < 0) return -1; - else if (pfd[0].revents & POLLIN) + else if (pfd[0].revents & POLLOUT) return send(sock, buffer, sz, 0); return 0; @@ -63,7 +88,7 @@ ssize_t input_pump(int sock, char *buffer, size_t sz) { struct pollfd pfd[1]; pfd[0].fd = sock; pfd[0].events = POLLIN; - int status = poll(pfd, 1, 15000); + int status = poll(pfd, 1, 10000); if (status < 0) return -1; else if (pfd[0].revents & POLLIN) diff --git a/server/src/session.c b/server/src/session.c index 66315fd..cc7d98c 100644 --- a/server/src/session.c +++ b/server/src/session.c @@ -33,7 +33,7 @@ ssize_t write_session(int id, char *buffer, size_t sz) { if (ses == NULL) return -1; - return send(ses->socket, buffer, sz, 0); + return output_pump(ses->socket, buffer, sz); } ssize_t read_session(int id, char *buffer, size_t sz) { @@ -41,7 +41,7 @@ ssize_t read_session(int id, char *buffer, size_t sz) { if (ses == NULL) return -1; - return recv(ses->socket, buffer, sz, 0); + return input_pump(ses->socket, buffer, sz); } void kill_session(int id) { -- cgit v1.2.3