summaryrefslogtreecommitdiff
path: root/server/src/server.c
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/server.c')
-rw-r--r--server/src/server.c37
1 files changed, 31 insertions, 6 deletions
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)