summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.org>2023-07-24 12:39:11 -0500
committerDanny Holman <dholman@gymli.org>2023-07-24 12:39:11 -0500
commit9e180ec16a519b252e00f94f533227a48ac6665e (patch)
tree0f20b95887d8764f3324bdb509d17e1a3a81e934 /server
parent8274ed4c6540b91a3ffc784a2a9b419e297bdaa7 (diff)
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 <dholman@gymli.org>
Diffstat (limited to 'server')
-rw-r--r--server/include/server.h2
-rw-r--r--server/src/server.c37
-rw-r--r--server/src/session.c4
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 <logging.h>
#include <mini-rat.h>
+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) {