commit f86fcc977e2edbd81e4b946fbef53bf7863b8dec Author: Ajurna Date: Mon Jul 28 09:03:00 2025 +0100 initial diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ff9047e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/cmake-build-debug/ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..072582b --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,10 @@ +cmake_minimum_required(VERSION 3.31) +project(cprotohackers C) + +set(CMAKE_C_STANDARD 23) + +add_executable(cprotohackers main.c + main.h + data.c + data.h) +target_link_libraries(cprotohackers wsock32 ws2_32) diff --git a/data.c b/data.c new file mode 100644 index 0000000..99af864 --- /dev/null +++ b/data.c @@ -0,0 +1,49 @@ +// +// Created by Ajurna on 28/07/2025. +// + +#include "data.h" + +#include +#include + +char_array_t *char_array_create(int capacity) { + char_array_t *array = malloc(sizeof(char_array_t)); + array->capacity = capacity; + array->size = 0; + array->data = calloc(capacity, sizeof(char)); + return array; +} +void char_array_destroy(char_array_t *array) { + free(array->data); + free(array); +}; +void char_array_append(char_array_t *array, char *value, size_t length) { + if (array->data == NULL) { + exit(1); + } + printf("old size: %llu\n", array->size); + printf("length: %llu\n", length); + size_t new_size = array->size + length; + printf("New size: %llu\n", new_size); + if (new_size > array->capacity) { + array->capacity = new_size; + char *new_array = realloc(array->data, array->capacity); + array->data = new_array; + if (array->data == NULL) { + printf("Failed to allocate memory for array\n"); + exit(1); + } + } + memcpy(array->data+array->size, value, length); + array->size = new_size; +}; + +void char_array_print(const char_array_t *array) { + printf("%s", array->data); +}; + +void char_array_wipe(char_array_t *array) { + array->size = 0; + memset(array->data, 0, array->capacity); +}; diff --git a/data.h b/data.h new file mode 100644 index 0000000..d488001 --- /dev/null +++ b/data.h @@ -0,0 +1,14 @@ +#pragma once +#include + +typedef struct CharArray { + size_t size; + size_t capacity; + char *data; +} char_array_t; + +char_array_t *char_array_create(int size); +void char_array_destroy(char_array_t *array); +void char_array_append(char_array_t *array, char *value, size_t length); +void char_array_print(const char_array_t *array); +void char_array_wipe(char_array_t *array); \ No newline at end of file diff --git a/main.c b/main.c new file mode 100644 index 0000000..b9ff1bd --- /dev/null +++ b/main.c @@ -0,0 +1,79 @@ +#include +#include +#include +#include "main.h" +#include "data.h" + +#define PORT 40000 +#define BUFFER_SIZE 1024 + + +int main() +{ + // load_file(); + + WSADATA WSAData; + + SOCKET client; + + SOCKADDR_IN serverAddr, clientAddr; + + WSAStartup(MAKEWORD(2,0), &WSAData); + SOCKET server = socket(AF_INET, SOCK_STREAM, 0); + + serverAddr.sin_addr.s_addr = INADDR_ANY; + serverAddr.sin_family = AF_INET; + serverAddr.sin_port = htons(PORT); + + bind(server, (SOCKADDR *)&serverAddr, sizeof(serverAddr)); + listen(server, 0); + + printf("Listening for incoming connections...\n"); + + char buffer[BUFFER_SIZE] = {0}; + int clientAddrSize = sizeof(clientAddr); + int recieved; + char_array_t *reply = char_array_create(1024); + while((client = accept(server, (SOCKADDR *)&clientAddr, &clientAddrSize)) != INVALID_SOCKET) + { + printf(" Client connected!\n"); + while ((recieved = recv(client, buffer, sizeof(buffer), 0)) > 0) { + printf(" Client says: |%.1024s|\n",buffer); + char_array_append(reply, buffer, recieved); + if (buffer[recieved] == '\0') { + break; + } + memset(buffer, 0, sizeof(buffer)); + Sleep(10); + } + + printf(" Sending back...\n"); + + printf(" Sending back: |%d| \n", reply->size); + send(client, reply->data,reply->size,0); + char_array_wipe(reply); + + closesocket(client); + printf("Client disconnected.\n"); + } +} + +void echo(SOCKET client) { + char buffer[BUFFER_SIZE] = {0}; + char_array_t *reply = char_array_create(BUFFER_SIZE); + int bytesReceived; + while ((bytesReceived = recv(client, buffer, sizeof(buffer), 0)) > 0) { + printf(" Client says: |%.1024s|\n",buffer); + char_array_append(reply, buffer, bytesReceived); + if (buffer[bytesReceived] == '\0') { + break; + } + memset(buffer, 0, sizeof(buffer)); + Sleep(10); + } + printf(" Sending back...\n"); + + printf(" Sending back: |%llu| \n", reply->size); + send(client, reply->data,reply->size,0); + closesocket(client); +} \ No newline at end of file diff --git a/main.h b/main.h new file mode 100644 index 0000000..f7ecf77 --- /dev/null +++ b/main.h @@ -0,0 +1,21 @@ +// +// Created by Ajurna on 27/07/2025. +// + +#ifndef MAIN_H +#define MAIN_H + +#endif //MAIN_H + + +typedef struct ReplyArray { + size_t size; + size_t capacity; + char *data; +} array_t; + +array_t *array_create(int size); +void array_destroy(array_t *array); +void array_append(array_t *array, char *value, size_t length); +void array_print(const array_t *array); +void array_wipe(array_t *array); \ No newline at end of file