summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAargh Rai <aargh.rai+git@gmail.com>2026-06-01 12:18:28 +0530
committerAargh Rai <aargh.rai+git@gmail.com>2026-06-01 12:18:28 +0530
commit29822a5d0f63bf0c1b34da636ddf27ecf22ca3cb (patch)
tree66234320292a113a7ac522117a8b9396ca31ee8b /src
parent97c2eacc290ef4ba298b6659ab8bba925203f125 (diff)
handling recv better & sending smaller packs so i don't need to handle more conditions
Diffstat (limited to 'src')
-rw-r--r--src/engine.c25
-rw-r--r--src/logger/logger.h11
-rw-r--r--src/server.c34
-rw-r--r--src/server/base64.c2
-rw-r--r--src/server/ws_key.c8
5 files changed, 49 insertions, 31 deletions
diff --git a/src/engine.c b/src/engine.c
index 52aa83b..187be28 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -40,19 +40,20 @@ int main(void) {
get_moves(&moves, position);
send_queue(tx, "Sending", 8);
- char buf[128];
- for (int i = 0; i <= moves.length / 32; i++) {
- for (int ii = 0; ii < 32; ii++) {
- if (moves.length <= 4 * i + ii) continue;
- struct sqrstr from_str = sqr_to_str(moves.moves[4 * i + ii].from);
- struct sqrstr to_str = sqr_to_str(moves.moves[4 * i + ii].to);
- buf[4 * ii + 0] = from_str.data[0];
- buf[4 * ii + 1] = from_str.data[1];
- buf[4 * ii + 2] = to_str.data[0];
- buf[4 * ii + 3] = to_str.data[1];
- buf[4 * ii + 4] = 0;
+ char buf[65];
+ int k = 0;
+ for (int i = 0; i < moves.length; i++) {
+ struct sqrstr from_str = sqr_to_str(moves.moves[i].from);
+ struct sqrstr to_str = sqr_to_str(moves.moves[i].to);
+ buf[k++] = from_str.data[0];
+ buf[k++] = from_str.data[1];
+ buf[k++] = to_str.data[0];
+ buf[k++] = to_str.data[1];
+ if (k == 64) {
+ buf[k] = 0;
+ send_queue(tx, buf, sizeof(buf));
+ k = 0;
}
- send_queue(tx, buf, sizeof(buf));
}
}
diff --git a/src/logger/logger.h b/src/logger/logger.h
index 5c82985..abcdb6d 100644
--- a/src/logger/logger.h
+++ b/src/logger/logger.h
@@ -5,19 +5,22 @@
#define LOG_LEVEL 3
#endif
+#ifndef HAS_LOG_MODULE
#ifndef LOG_MODULE
#define HAS_LOG_MODULE 0
#define LOG_MODULE ""
#else
#define HAS_LOG_MODULE 1
#endif
+#endif
#if LOG_LEVEL >= 3
#define log_infof(...) do { \
char log_buf[1024]; \
int n = 1; \
+ log_buf[0] = 'i'; \
if (HAS_LOG_MODULE == 1) { \
- n = snprintf(log_buf, 1024, "i(%s) ", LOG_MODULE); \
+ n = snprintf(log_buf + 1, 1023, "(%s) ", LOG_MODULE); \
} \
snprintf(log_buf + n, 1024 - n, __VA_ARGS__); \
send_log(logging, log_buf, 1024); \
@@ -28,8 +31,9 @@
#define log_warnf(...) do { \
char log_buf[1024]; \
int n = 1; \
+ log_buf[0] = 'w'; \
if (HAS_LOG_MODULE == 1) { \
- n = snprintf(log_buf, 1024, "w(%s) ", LOG_MODULE); \
+ n = snprintf(log_buf + 1, 1023, "(%s) ", LOG_MODULE); \
} \
snprintf(log_buf + n, 1024 - n, __VA_ARGS__); \
send_log(logging, log_buf, 1024); \
@@ -40,8 +44,9 @@
#define log_errof(...) do { \
char log_buf[1024]; \
int n = 1; \
+ log_buf[0] = 'e'; \
if (HAS_LOG_MODULE == 1) { \
- n = snprintf(log_buf, 1024, "e(%s) ", LOG_MODULE); \
+ n = snprintf(log_buf + 1, 1023, "(%s) ", LOG_MODULE); \
} \
snprintf(log_buf + n, 1024 - n, __VA_ARGS__); \
send_log(logging, log_buf, 1024); \
diff --git a/src/server.c b/src/server.c
index 1886712..80ba5ce 100644
--- a/src/server.c
+++ b/src/server.c
@@ -1,8 +1,4 @@
-#include <arpa/inet.h>
-#include <netinet/in.h>
-#include <openssl/sha.h>
-#include <stdio.h>
-#include <string.h>
+#include <errno.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <assert.h>
@@ -10,13 +6,12 @@
#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"
-#include "ipc.c"
mqd_t logging, tx, rx;
int handle_client(int client);
@@ -48,6 +43,7 @@ int main(void) {
log_infof("Listening on %d", PORT);
+ // https://websocket.org/guides/websocket-protocol/
while(1) {
int client = accept(server_fd, NULL, NULL);
@@ -101,9 +97,16 @@ int main(void) {
int handle_client(int client) {
unsigned char hdr[2];
+ int recvn;
- if (recv(client, hdr, 2, MSG_WAITALL) != 2) {
- log_warnf("{%d} recv close", client)
+ 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;
}
@@ -129,11 +132,6 @@ int handle_client(int client) {
return 1;
}
- if (len >= 126) {
- log_infof("{%d} unsupported length %u", client, len);
- return 0;
- }
-
unsigned char mask[4];
recv(client, mask, 4, MSG_WAITALL);
@@ -149,14 +147,18 @@ int handle_client(int client) {
unsigned char out[1024];
out[0] = 0x81;
+ int shift;
for (int i = 0; i < response.count; i++) {
struct str item = response.data[i];
- out[1] = item.len;
- assert(item.len <= 1022);
+ 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;
diff --git a/src/server/base64.c b/src/server/base64.c
index 3400cfb..7e52eb9 100644
--- a/src/server/base64.c
+++ b/src/server/base64.c
@@ -1,3 +1,5 @@
+#include <stddef.h>
+
static const char b64[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz"
diff --git a/src/server/ws_key.c b/src/server/ws_key.c
index ca66b81..015605e 100644
--- a/src/server/ws_key.c
+++ b/src/server/ws_key.c
@@ -1,3 +1,11 @@
+#include <openssl/sha.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <string.h>
+#include <stdio.h>
+
+#include "./base64.c"
+
static const char *GUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
void websocket_accept_key(const char *client_key, char *output) {