Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
2.7 kB
3
Indexable
Never
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

#define MAX_KEY_LEN 256
#define MAX_VALUE_LEN 1024
#define MAX_REQUEST_LEN (MAX_KEY_LEN + MAX_VALUE_LEN + 10) // 10 для команды и разделителей

// Структура для хранения данных
typedef struct {
    char key[MAX_KEY_LEN];
    char value[MAX_VALUE_LEN];
} KeyValuePair;

// Простейшая хеш-таблица
KeyValuePair database[1000];
int database_size = 0;

// Функция для поиска значения по ключу
char* get_value(char* key) {
    for (int i = 0; i < database_size; ++i) {
        if (strcmp(database[i].key, key) == 0) {
            return database[i].value;
        }
    }
    return "Key not found";
}

// Функция для установки значения по ключу
void set_value(char* key, char* value) {
    strcpy(database[database_size].key, key);
    strcpy(database[database_size].value, value);
    database_size++;
}

// Функция для обработки запросов от клиентов
void handle_client(int client_fd) {
    char request[MAX_REQUEST_LEN];
    char key[MAX_KEY_LEN];
    char value[MAX_VALUE_LEN];

    // Чтение запроса от клиента
    read(client_fd, request, sizeof(request));
    sscanf(request, "%s %s", key, value);

    // Обработка запроса и отправка ответа
    if (strcmp(request, "GET") == 0) {
        char* result = get_value(key);
        write(client_fd, result, strlen(result) + 1);
    } else if (strcmp(request, "SET") == 0) {
        set_value(key, value);
        write(client_fd, "Value set", 10);
    } else {
        write(client_fd, "Invalid command", 15);
    }

    close(client_fd);
}

int main() {
    mkfifo("server_fifo", 0666);
    int server_fd = open("server_fifo", O_RDONLY);
    if (server_fd == -1) {
        perror("Server FIFO");
        exit(EXIT_FAILURE);
    }

    while (1) {
        int client_fd = accept(server_fd, NULL, NULL);
        if (client_fd == -1) {
            perror("Accept");
            continue;
        }
        
        // Создание нового процесса для обработки клиента
        pid_t pid = fork();
        if (pid == 0) { // Дочерний процесс
            handle_client(client_fd);
            exit(EXIT_SUCCESS);
        } else if (pid < 0) { // Ошибка при создании процесса
            perror("Fork");
        }
        
        close(client_fd);
    }

    close(server_fd);
    unlink("server_fifo");

    return 0;
}
Leave a Comment