Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа.docx
Скачиваний:
0
Добавлен:
02.08.2026
Размер:
691 Кб
Скачать

Приложение 3 Текст программы «client.Cpp»

#include <iostream>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h> // Добавлено для inet_pton

#include <unistd.h>

#include <cstring>

int main() {

int sock;

struct sockaddr_in serverAddress;

const char* serverIP = "127.0.0.1"; // IP-адрес сервера (localhost)

int serverPort;

// Выбор сервера

int serverChoice;

std::cout << "Выберите сервер для подключения:\n1. Первый сервер (порт 8081)\n2. Второй сервер (порт 8082)\n";

std::cin >> serverChoice;

if (serverChoice == 1) {

serverPort = 8081; // Порт первого сервера

} else if (serverChoice == 2) {

serverPort = 8082; // Порт второго сервера

} else {

std::cerr << "Неверный выбор. Завершение программы." << std::endl;

return 1;

}

// Создание сокета

sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock < 0) {

std::cerr << "Ошибка при создании сокета" << std::endl;

return 1;

}

// Настройка адреса сервера

serverAddress.sin_family = AF_INET;

serverAddress.sin_port = htons(serverPort);

inet_pton(AF_INET, serverIP, &serverAddress.sin_addr);

// Подключение к серверу

if (connect(sock, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {

std::cerr << "Ошибка при подключении к серверу" << std::endl;

close(sock);

return 1;

}

// Запрос единицы измерения только для второго сервера

std::string unit;

if (serverChoice == 2) {

std::cout << "Введите единицу измерения (bytes, mb, gb): ";

std::cin >> unit;

}

// Отправка единицы измерения серверу, если она была введена

if (serverChoice == 2) {

send(sock, unit.c_str(), unit.size(), 0);

}

// Получение ответа от сервера

char buffer[1024];

ssize_t bytesReceived = recv(sock, buffer, sizeof(buffer) - 1, 0);

if (bytesReceived > 0) {

buffer[bytesReceived] = '\0'; // Завершение строки

std::cout << "Ответ от сервера:\n" << buffer << std::endl;

} else {

std::cerr << "Ошибка при получении данных от сервера" << std::endl;

}

// Закрытие сокета

close(sock);

return 0;

}

Приложение 4 Текст программы «log.Cpp»

#include <iostream>

#include <fstream>

#include <string>

#include <thread>

#include <sys/socket.h>

#include <netinet/in.h>

#include <unistd.h>

#include <ctime>

// Функция для получения текущего времени

std::string getCurrentTime() {

time_t now = time(0);

char buffer[80];

struct tm tstruct;

localtime_r(&now, &tstruct);

strftime(buffer, sizeof(buffer), "%Y-%m-%d %X", &tstruct);

return std::string(buffer);

}

// Функция для записи лога в файл

void writeLog(const std::string& message) {

std::ofstream logStream("server.log", std::ios::app); // Записываем в общий файл server.log

if (logStream.is_open()) {

logStream << "[" << getCurrentTime() << "] " << message << std::endl;

logStream.close();

} else {

std::cerr << "Ошибка при открытии файла лога: server.log" << std::endl;

}

}

// Функция для обработки сообщений от серверов задач

void handleServer(int clientSocket) {

char buffer[1024];

while (true) {

ssize_t bytesReceived = recv(clientSocket, buffer, sizeof(buffer) - 1, 0);

if (bytesReceived <= 0) {

std::cout << "Соединение с сервером задач закрыто." << std::endl;

break;

}

buffer[bytesReceived] = '\0'; // Завершение строки

std::string message(buffer);

// Запись сообщения в лог

writeLog(message);

}

close(clientSocket);

}

int main() {

// Создание сокета для сервера логирования

int logServerSocket = socket(AF_INET, SOCK_STREAM, 0);

if (logServerSocket < 0) {

std::cerr << "Ошибка при создании сокета сервера логирования" << std::endl;

return 1;

}

// Настройка адреса сервера логирования

struct sockaddr_in logServerAddress;

logServerAddress.sin_family = AF_INET;

logServerAddress.sin_addr.s_addr = INADDR_ANY;

logServerAddress.sin_port = htons(9000); // Порт для сервера логирования

// Привязка сокета

if (bind(logServerSocket, (struct sockaddr*)&logServerAddress, sizeof(logServerAddress)) < 0) {

std::cerr << "Ошибка при привязке сокета сервера логирования" << std::endl;

close(logServerSocket);

return 1;

}

// Начало прослушивания входящих соединений

if (listen(logServerSocket, 5) < 0) {

std::cerr << "Ошибка при прослушивании сокета сервера логирования" << std::endl;

close(logServerSocket);

return 1;

}

std::cout << "Сервер логирования запущен и ожидает подключения серверов задач..." << std::endl;

// Основной цикл для обработки подключений серверов задач

while (true) {

int clientSocket = accept(logServerSocket, nullptr, nullptr);

if (clientSocket < 0) {

std::cerr << "Ошибка при принятии соединения" << std::endl;

continue;

}

std::cout << "Подключен сервер задач!" << std::endl;

// Создаем поток для обработки сообщений от сервера задач

std::thread logThread(handleServer, clientSocket);

logThread.detach();

}

close(logServerSocket);

return 0;

}