From a72cceca006018920340567591b39cebb3845419 Mon Sep 17 00:00:00 2001 From: Ajurna Date: Wed, 30 Jul 2025 21:59:33 +0100 Subject: [PATCH] server04 passed --- server04.c | 36 +++++++++++++++++--------- server04.h | 2 +- server04_database_client_test_suite.py | 10 ++++--- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/server04.c b/server04.c index 25c1698..50af204 100644 --- a/server04.c +++ b/server04.c @@ -20,28 +20,41 @@ int main() { int connection_number = 1; char *request = malloc(BUF_SIZE); char buffer[BUF_SIZE] = {0}; - int bytesReceived; data_map_t *data = data_map_create(1024); printf("Listening for incoming connections...\n"); - while ((bytesReceived = recvfrom(server, buffer, sizeof(buffer), 0, (SOCKADDR *) &clientAddr, &clientAddrSize)) > 0) { + while (true) { + int bytesReceived = recvfrom(server, buffer, sizeof(buffer), 0, (SOCKADDR *) &clientAddr, &clientAddrSize); const char *equals = "="; size_t pos; // IN_ADDR addr = clientAddr.sin_addr; // printf("{%d} Client ip: |%d.%d.%d.%d| \n", connection_number, addr.S_un.S_un_b.s_b1, addr.S_un.S_un_b.s_b2, addr.S_un.S_un_b.s_b3, addr.S_un.S_un_b.s_b4); // printf("{%d} Client port: |%d| \n", connection_number, clientAddr.sin_port); - if ((pos = strcspn(buffer, equals)) >= 0) { + printf("{%d} Client sent: |%s| \n", connection_number, buffer); + if ((pos = strcspn(buffer, equals)) != strlen(buffer)) { key_value_t *kv = malloc(sizeof(key_value_t)); + kv->key = malloc(sizeof(char)*1024); + kv->value = malloc(sizeof(char)*1024); strncpy_s(kv->key, BUF_SIZE, buffer, pos); strncpy_s(kv->value, BUF_SIZE, buffer + sizeof(char)*(pos+1), sizeof(buffer) - pos - 1); data_map_insert_kv(data, kv); printf("{%d} Key: |%s| Value: |%s| \n", connection_number, kv->key, kv->value); } else { - printf("{%d} Client sent: |%s| \n", connection_number, buffer); + printf("{%d} Client query: |%s| \n", connection_number, buffer); + char *value = data_map_get(data, buffer); + if (strcmp(buffer, "version") == 0) { + const char *version = "version=Ken's Key-Value Store 1.0"; + sendto(server, version, strlen(version), 0, (SOCKADDR *) &clientAddr, clientAddrSize); + } else { + sprintf(buffer, "%s=%s", buffer, value); + sendto(server, buffer, strlen(buffer), 0, (SOCKADDR *) &clientAddr, clientAddrSize); + } + } - sendto(server, buffer, bytesReceived, 0, (SOCKADDR *) &clientAddr, clientAddrSize); - strncpy_s(request, BUF_SIZE, buffer, bytesReceived); - printf("{%d} Client sent: |%s| \n", connection_number, request); + // sendto(server, buffer, bytesReceived, 0, (SOCKADDR *) &clientAddr, clientAddrSize); + // strncpy_s(request, BUF_SIZE, buffer, bytesReceived); + // printf("{%d} Client sent: |%s| \n", connection_number, request); connection_number++; + memset(buffer, 0, sizeof(buffer)); } data_map_free(data); free(request); @@ -64,7 +77,7 @@ void data_map_free(data_map_t *map) { free(map); } void data_map_insert_kv(data_map_t *map, key_value_t *kv) { - if (map->data == NULL) { + if (map==NULL || map->data == NULL) { exit(1); } for (int i = 0; i < map->count; i++) { @@ -79,8 +92,7 @@ void data_map_insert_kv(data_map_t *map, key_value_t *kv) { key_value_t *new_array = realloc(map->data, map->capacity * sizeof(key_value_t)); map->data = new_array; } - map->data[map->count].key = kv->key; - map->data[map->count].value = kv->value; + map->data[map->count] = *kv; map->count = new_size; } @@ -115,11 +127,11 @@ void data_map_insert(data_map_t *map, char *key, char *value) { data_map_append(map, key, value); } -char *data_map_get(data_map_t *map, const char *key) { +char *data_map_get(const data_map_t *map, const char *key) { for (int i = 0; i < map->count; i++) { if (strcmp(map->data[i].key, key) == 0) { return map->data[i].value; } } - return NULL; + return ""; } \ No newline at end of file diff --git a/server04.h b/server04.h index 213cf06..9ff8b9e 100644 --- a/server04.h +++ b/server04.h @@ -25,4 +25,4 @@ void data_map_free(data_map_t *map); void data_map_append(data_map_t *map, char *key, char *value); void data_map_insert(data_map_t *map, char *key, char *value); void data_map_insert_kv(data_map_t *map, key_value_t *kv); -char *data_map_get(data_map_t *map, const char *key); +char *data_map_get(const data_map_t *map, const char *key); diff --git a/server04_database_client_test_suite.py b/server04_database_client_test_suite.py index 2b067cb..d2edc3d 100644 --- a/server04_database_client_test_suite.py +++ b/server04_database_client_test_suite.py @@ -4,16 +4,18 @@ import time import random from typing import Optional, Dict, List, Tuple + class DatabaseTestClient: def __init__(self, host: str = 'localhost', server_port: int = 40000): self.host = host self.server_port = server_port - self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM ) + self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # Bind to any available interface (empty string) on an ephemeral port (0) - self.sock.bind(('', 0)) + self.sock.bind(('0.0.0.0', 50000)) # Get the actual port assigned self.client_port = self.sock.getsockname()[1] - self.sock.settimeout(1.0) # 1 second timeout for receives + self.sock.settimeout(5.0) # 1 second timeout for receives print(f"Client bound to port {self.client_port}") def send_insert(self, key: str, value: str) -> None: @@ -30,7 +32,7 @@ class DatabaseTestClient: self.sock.sendto(key.encode(), (self.host, self.server_port)) try: - data, addr = self.sock.recvfrom(1000) # Changed from recvmsg to recvfrom + data, addr = self.sock.recvfrom(1024) # Changed from recvmsg to recvfrom return data.decode() except socket.timeout: return None