- •Задание на курсовую работу
- •Оглавление
- •Введение
- •Постановка задачи
- •1. Теоретические основы разрабатываемой системы
- •2. Описание алгоритма работы приложения
- •3. Описание структуры приложения
- •Основная функция клиента:
- •4. Результаты работы приложения
- •Заключение
- •Список использованной литературы
- •Приложение 1 Текст программы «server111.Cpp»
- •Основная функция сервера логирования:
- •Приложение 2 Текст программы «server222.Cpp»
- •Приложение 3 Текст программы «client.Cpp»
- •Приложение 4 Текст программы «log.Cpp»
- •Приложение 5 Текст программы «server1.Cpp»
- •Приложение 6 Текст программы «server2.Cpp»
- •Приложение 7 Текст программы «client.Cpp»
- •Приложение 8 Текст программы «clientOs.Cpp»
Приложение 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;
}
