From 941187d3f0eb970c76eb690be631f6de62321f2d Mon Sep 17 00:00:00 2001 From: gandc Date: Fri, 14 Mar 2025 16:53:56 +0300 Subject: [PATCH] first version of server --- server.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) diff --git a/server.c b/server.c index e69de29..491caff 100644 --- a/server.c +++ b/server.c @@ -0,0 +1,105 @@ +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 1024 + +// Функция для обработки одного клиента +void handle_client(int client_sock, struct sockaddr_in client_addr) { + char buffer[BUFFER_SIZE]; + int n; + int target = rand() % 100 + 1; // Случайное число от 1 до 100 + char client_ip[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN); + + printf("%s: Клиент подключился.\n", client_ip); + + while (1) { + memset(buffer, 0, BUFFER_SIZE); + n = recv(client_sock, buffer, BUFFER_SIZE - 1, 0); + if (n <= 0) { + break; + } + buffer[n] = '\0'; + printf("%s: Получено сообщение: %s\n", client_ip, buffer); + + int guess = atoi(buffer); + char response[BUFFER_SIZE]; + if (guess < target) { + strcpy(response, ">"); + } else if (guess > target) { + strcpy(response, "<"); + } else { + strcpy(response, "="); + } + + send(client_sock, response, strlen(response), 0); + printf("%s: Отправлен ответ: %s\n", client_ip, response); + + if (guess == target) { + break; + } + } + + printf("%s: Клиент отключился.\n", client_ip); + close(client_sock); +} + +int main(int argc, char *argv[]) { + if (argc != 2) { + fprintf(stderr, "Использование: %s <порт>\n", argv[0]); + exit(EXIT_FAILURE); + } + + int server_sock, client_sock; + struct sockaddr_in server_addr, client_addr; + socklen_t addr_len = sizeof(client_addr); + int port = atoi(argv[1]); + + srand(time(NULL)); + + // Создание сокета + if ((server_sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) { + perror("Ошибка создания сокета"); + exit(EXIT_FAILURE); + } + + // Настройка адреса сервера + server_addr.sin_family = AF_INET; + server_addr.sin_addr.s_addr = INADDR_ANY; + server_addr.sin_port = htons(port); + + // Привязка сокета + if (bind(server_sock, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) { + perror("Ошибка bind"); + close(server_sock); + exit(EXIT_FAILURE); + } + + // Перевод сокета в режим прослушивания + if (listen(server_sock, 5) < 0) { + perror("Ошибка listen"); + close(server_sock); + exit(EXIT_FAILURE); + } + + printf("Сервер запущен на порту %d\n", port); + + // Основной цикл для приема соединений + while (1) { + if ((client_sock = accept(server_sock, (struct sockaddr*)&client_addr, &addr_len)) < 0) { + perror("Ошибка accept"); + continue; + } + + // Обработка клиента (в данном примере в одном процессе; для масштабирования можно создавать потоки) + handle_client(client_sock, client_addr); + } + + close(server_sock); + return 0; +}