diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/server.c | 118 | ||||
| -rw-r--r-- | src/server/comms.c | 8 |
2 files changed, 76 insertions, 50 deletions
diff --git a/src/server.c b/src/server.c index ea18a68..1886712 100644 --- a/src/server.c +++ b/src/server.c @@ -18,10 +18,13 @@ #include "server/comms.c" #include "ipc.c" +mqd_t logging, tx, rx; +int handle_client(int client); + int main(void) { - mqd_t logging = mq_open("/logs", O_WRONLY); - mqd_t tx = mq_open("/server_to_engine", O_WRONLY); - mqd_t rx = mq_open("/engine_to_server", O_RDONLY); + logging = mq_open("/logs", O_WRONLY); + tx = mq_open("/server_to_engine", O_WRONLY); + rx = mq_open("/engine_to_server", O_RDONLY); int server_fd = socket(AF_INET, SOCK_STREAM, 0); int opt = 1; @@ -45,7 +48,7 @@ int main(void) { log_infof("Listening on %d", PORT); - for (;;) { + while(1) { int client = accept(server_fd, NULL, NULL); if (client < 0) continue; @@ -84,58 +87,81 @@ int main(void) { ); send(client, response, strlen(response), 0); - log_infof("WebSocket connected"); + if (fork() == 0) { + log_infof("{%d} WebSocket connected", client); + while(1) { + if (handle_client(client)) continue; + else break; + } + log_infof("{%d} WebSocket disconnected", client); + close(client); + } + } +} - for (;;) { - unsigned char hdr[2]; +int handle_client(int client) { + unsigned char hdr[2]; - if (recv(client, hdr, 2, MSG_WAITALL) != 2) - break; + if (recv(client, hdr, 2, MSG_WAITALL) != 2) { + log_warnf("{%d} recv close", client) + return 0; + } - unsigned opcode = hdr[0] & 0x0F; - unsigned len = hdr[1] & 0x7F; - if (opcode == 0x8) { - unsigned char close_frame[2] = {0x88, 0x00}; - send(client, close_frame, 2, 0); - break; - } + unsigned opcode = hdr[0] & 0x0F; + unsigned len = hdr[1] & 0x7F; + log_infof( + "{%d} opcode=%u len=%u masked=%u", + client, + opcode, + hdr[1] & 0x7F, + !!(hdr[1] & 0x80) + ); + if (opcode == 0x8) { + unsigned char close_frame[2] = {0x88, 0x00}; + send(client, close_frame, 2, 0); + log_warnf("{%d} opcode 0x8 close", client); + return 0; + } - if (opcode == 0x9) { - unsigned char pong[2] = {0x8A, 0x00}; - send(client, pong, 2, 0); - continue; - } - if (len >= 126) break; + if (opcode == 0x9) { + unsigned char pong[2] = {0x8A, 0x00}; + send(client, pong, 2, 0); + return 1; + } - unsigned char mask[4]; - recv(client, mask, 4, MSG_WAITALL); + if (len >= 126) { + log_infof("{%d} unsupported length %u", client, len); + return 0; + } - unsigned char payload[126]; - recv(client, payload, len, MSG_WAITALL); + unsigned char mask[4]; + recv(client, mask, 4, MSG_WAITALL); - for (unsigned i = 0; i < len; i++) - payload[i] ^= mask[i % 4]; + unsigned char payload[126]; + recv(client, payload, len, MSG_WAITALL); - char* payload_ptr = (char*)payload; - struct strs response = handle_input(logging, tx, rx, payload_ptr, len); + for (unsigned i = 0; i < len; i++) + payload[i] ^= mask[i % 4]; - unsigned char out[128]; - out[0] = 0x81; - for (int i = 0; i < response.count; i++) { - struct str item = response.data[i]; - out[1] = item.len; - assert(item.len <= 125); + payload[len] = 0; + char* payload_ptr = (char*)payload; + struct strs response = handle_input(logging, tx, rx, payload_ptr, len); - memcpy(out + 2, item.msg, item.len); - send(client, out, item.len + 2, 0); - } - char end_transmission[] = "END-TRANSMISSION"; - int n = strlen(end_transmission); - out[1] = n; + unsigned char out[1024]; + out[0] = 0x81; + for (int i = 0; i < response.count; i++) { + struct str item = response.data[i]; + out[1] = item.len; + assert(item.len <= 1022); - memcpy(out + 2, end_transmission, n); - send(client, out, n + 2, 0); - } - close(client); + memcpy(out + 2, item.msg, item.len); + send(client, out, item.len + 2, 0); } + char end_transmission[] = "END-TRANSMISSION"; + int n = strlen(end_transmission); + out[1] = n; + + memcpy(out + 2, end_transmission, n); + send(client, out, n + 2, 0); + return 1; } diff --git a/src/server/comms.c b/src/server/comms.c index 9dd83b9..cc5a0ce 100644 --- a/src/server/comms.c +++ b/src/server/comms.c @@ -4,14 +4,14 @@ #include "../logger/logger.h" struct str { - char msg[126]; + char msg[1023]; int len; }; void set_output(struct str* output, char* msg) { int i = 0; while (msg[i] != 0) { - assert(i < 126); + assert(i < 1023); output->msg[i] = msg[i]; i++; } @@ -45,7 +45,8 @@ void add_str(struct strs* strs, char* str) { } struct strs handle_input(mqd_t logging, mqd_t tx, mqd_t rx, char* payload, int len) { - send_queue(tx, payload, len); + log_infof("after: %d", payload[len]); + send_queue(tx, payload, len + 1); char* buf = read_queue(rx); struct strs output = init_strs(); @@ -62,6 +63,5 @@ struct strs handle_input(mqd_t logging, mqd_t tx, mqd_t rx, char* payload, int l n--; if (n == 0) n = get_num_messages(rx); } - log_infof("Handled the request"); return output; } |
