Untitled
unknown
plain_text
a year ago
2.7 kB
7
Indexable
#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;
}
Editor is loading...
Leave a Comment