initial
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/cmake-build-debug/
|
||||||
10
CMakeLists.txt
Normal file
10
CMakeLists.txt
Normal file
@@ -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)
|
||||||
49
data.c
Normal file
49
data.c
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
//
|
||||||
|
// Created by Ajurna on 28/07/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
#include "data.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
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);
|
||||||
|
};
|
||||||
14
data.h
Normal file
14
data.h
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#pragma once
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
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);
|
||||||
79
main.c
Normal file
79
main.c
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <winsock2.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#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);
|
||||||
|
}
|
||||||
21
main.h
Normal file
21
main.h
Normal file
@@ -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);
|
||||||
Reference in New Issue
Block a user