From 49cc88def2f9edea59e79ca37f41400ad870579e Mon Sep 17 00:00:00 2001 From: Aargh Rai Date: Wed, 27 May 2026 17:13:14 +0530 Subject: went through all, but comms is working --- src/server.c | 89 +++++++++++++++++++++++------------------------------------- 1 file changed, 34 insertions(+), 55 deletions(-) (limited to 'src/server.c') diff --git a/src/server.c b/src/server.c index 8de6d01..83f9349 100644 --- a/src/server.c +++ b/src/server.c @@ -5,67 +5,35 @@ #include #include #include +#include +#include #include #define PORT 3456 -static const char *GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; -static const char b64[] = - "ABCDEFGHIJKLMNOPQRSTUVWXYZ" - "abcdefghijklmnopqrstuvwxyz" - "0123456789+/"; +#include "server/base64.c" +#include "server/ws_key.c" +#include "server/comms.c" +#include "ipc.h" -void base64_encode( - const unsigned char *in, - size_t len, - char *out -) { - size_t i, j = 0; +int main(int argc, char** argv) { + assert(argc == 2); - for (i = 0; i < len; i += 3) { - unsigned v = in[i] << 16; + mqd_t tx = mq_open("/server_to_engine", O_CREAT | O_WRONLY, 0666, &attr); + mqd_t rx = mq_open("/engine_to_server", O_CREAT | O_RDONLY, 0666, &attr); - if (i + 1 < len) v |= in[i + 1] << 8; - if (i + 2 < len) v |= in[i + 2]; - - out[j++] = b64[(v >> 18) & 63]; - out[j++] = b64[(v >> 12) & 63]; - - out[j++] = (i + 1 < len) ? b64[(v >> 6) & 63] : '='; - out[j++] = (i + 2 < len) ? b64[v & 63] : '='; + if (fork() == 0) { + char* args[] = {argv[1], "listen", NULL}; + execvp(args[0], args); + return 0; } - out[j] = 0; -} - -void websocket_accept_key(const char *client_key, char *output) { - char buf[256]; - snprintf(buf, sizeof(buf), "%s%s", client_key, GUID); - - unsigned char hash[SHA_DIGEST_LENGTH]; - SHA1((unsigned char *)buf, strlen(buf), hash); - base64_encode(hash, SHA_DIGEST_LENGTH, output); -} - -char *find_websocket_key(char *req) { - char *p = strstr(req, "Sec-WebSocket-Key:"); + char* buf = malloc(attr.mq_msgsize); + int n = mq_receive(rx, buf, attr.mq_msgsize, NULL); + printf("%s", buf); + return 0; - if (!p) return NULL; - p += strlen("Sec-WebSocket-Key:"); - - while (*p == ' ') p++; - - static char key[128]; - int i = 0; - while (*p && *p != '\r' && *p != '\n') - key[i++] = *p++; - - key[i] = 0; - return key; -} - -int main(void) { int server_fd = socket(AF_INET, SOCK_STREAM, 0); int opt = 1; @@ -88,6 +56,7 @@ int main(void) { int n = recv(client, req, sizeof(req) - 1, 0); if (n <= 0) { + printf("Client close"); close(client); continue; } @@ -140,14 +109,24 @@ int main(void) { for (unsigned i = 0; i < len; i++) payload[i] ^= mask[i % 4]; - printf("Message: %.*s\n", len, payload); + char* payload_ptr = payload; + struct strs response = handle_input(payload_ptr, len); unsigned char out[128]; out[0] = 0x81; - out[1] = len; - - memcpy(out + 2, payload, len); - send(client, out, len + 2, 0); + for (int i = 0; i < response.count; i++) { + struct str item = response.data[i]; + out[1] = item.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; + + memcpy(out + 2, end_transmission, n); + send(client, out, n + 2, 0); } close(client); } -- cgit v1.2.3