diff options
| author | Aargh Rai <aargh.rai+git@gmail.com> | 2026-07-10 16:01:57 +0530 |
|---|---|---|
| committer | Aargh Rai <aargh.rai+git@gmail.com> | 2026-07-10 16:01:57 +0530 |
| commit | a14da2fe3864712dab4e7c4cfb5c323026d668de (patch) | |
| tree | 418c8c8ff44a611cbe1c1269b10926527046e232 /src/server.c | |
| parent | 2761f8a533e2b025f209222a1e4ec70b91c7e8ee (diff) | |
moving header files to include directory & moving resources in it's own directory
i know currently there is race condition, but the code is getting too
messy, i will continue to this after i make a vis tool to analyse how i
should split up files & stuff
the code rn needs intense restructing for it to make any more progress
Diffstat (limited to 'src/server.c')
| -rw-r--r-- | src/server.c | 190 |
1 files changed, 0 insertions, 190 deletions
diff --git a/src/server.c b/src/server.c deleted file mode 100644 index 7ff9c87..0000000 --- a/src/server.c +++ /dev/null @@ -1,190 +0,0 @@ -#include <errno.h> -#include <sys/socket.h> -#include <sys/wait.h> -#include <assert.h> -#include <unistd.h> - -#define LOG_MODULE "server" -#include "logger/logger.h" -#include "string.h" - -#define PORT 3456 - -#include "server/base64.c" -#include "server/ws_key.c" -#include "server/comms.c" - -mqd_t logging, tx, rx; -int handle_client(int client); - -int main(void) { - 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; - - setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); - struct sockaddr_in addr = { - .sin_family = AF_INET, - .sin_addr.s_addr = INADDR_ANY, - .sin_port = htons(PORT) - }; - - if (bind(server_fd, (struct sockaddr *)&addr, sizeof(addr)) < 0) { - perror("bind"); - return 1; - } - - if (listen(server_fd, 16) < 0) { - perror("listen"); - return 1; - } - - log_infof("Listening on %d", PORT); - - // https://websocket.org/guides/websocket-protocol/ - while(1) { - int client = accept(server_fd, NULL, NULL); - - if (client < 0) continue; - char req[4096]; - - int n = recv(client, req, sizeof(req) - 1, 0); - if (n <= 0) { - log_infof("Client close"); - close(client); - continue; - } - - req[n] = 0; - - char *key = find_websocket_key(req); - - if (!key) { - close(client); - continue; - } - - char accept_key[128]; - - websocket_accept_key(key, accept_key); - char response[512]; - - snprintf( - response, - sizeof(response), - "HTTP/1.1 101 Switching Protocols\r\n" - "Upgrade: websocket\r\n" - "Connection: Upgrade\r\n" - "Sec-WebSocket-Accept: %s\r\n" - "\r\n", - accept_key - ); - - send(client, response, strlen(response), 0); - 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); - } - } -} - -int handle_client(int client) { - unsigned char hdr[2]; - int recvn; - - if ((recvn = recv(client, hdr, 2, MSG_WAITALL)) != 2) { - if (recvn == -1) { - char buf[256]; - if (strerror_r(errno, buf, sizeof(buf)) == 0) { - log_warnf("recv: %s", buf); - } - } - log_warnf("{%d} recv close %d", client, recvn); - return 0; - } - - 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); - return 1; - } - - unsigned char mask[4]; - recvn = recv(client, mask, 4, MSG_WAITALL); - if (recvn == -1) { - char buf[256]; - if (strerror_r(errno, buf, sizeof(buf)) == 0) { - log_warnf("mask recv err: %s", buf); - } - } else { - char mask_hex[256] = {0}; - base64_encode(mask, 126, mask_hex); - log_infof("mask recv{%d}: %s", recvn, mask_hex); - } - - unsigned char payload[126]; - recvn = recv(client, payload, len, MSG_WAITALL); - if (recvn == -1) { - char buf[256]; - if (strerror_r(errno, buf, sizeof(buf)) == 0) { - log_warnf("payload recv err: %s", buf); - } - } else { - char payload_hex[256] = {0}; - base64_encode(payload, 126, payload_hex); - log_infof("payload recv{%d}: %s", recvn, payload_hex); - } - - for (unsigned i = 0; i < len; i++) - payload[i] ^= mask[i % 4]; - - payload[len] = 0; - char* payload_ptr = (char*)payload; - struct strs response = handle_input(logging, tx, rx, payload_ptr, len); - - unsigned char out[1024]; - out[0] = 0x81; - int shift; - for (int i = 0; i < response.count; i++) { - struct str item = response.data[i]; - assert(item.len <= 125); - - log_infof("Replying %d: %.*s", client, item.len, item.msg) - out[1] = item.len; - shift = 2; - memcpy(out + 2, item.msg, item.len); - send(client, out, item.len + 2, 0); - } - log_infof("Replying %d: END-TRANSMISSION", client) - 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; -} |
