- •Задание на курсовую работу
- •Оглавление
- •Введение
- •Постановка задачи
- •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»
Приложение 2 Текст программы «server222.Cpp»
#include <iostream>
#include <sys/sysinfo.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <cstring>
#include <ctime>
#include <thread>
#include <arpa/inet.h> // For inet_pton
// Function to send logs to the logging server
void sendLog(const std::string& message, const std::string& serverId) {
int logSocket = socket(AF_INET, SOCK_STREAM, 0);
if (logSocket < 0) {
std::cerr << "Error creating socket for logging" << std::endl;
return;
}
struct sockaddr_in logServerAddress;
logServerAddress.sin_family = AF_INET;
logServerAddress.sin_port = htons(9000); // Logging server port
inet_pton(AF_INET, "127.0.0.1", &logServerAddress.sin_addr); // Logging server IP
if (connect(logSocket, (struct sockaddr*)&logServerAddress, sizeof(logServerAddress)) < 0) {
std::cerr << "Error connecting to the logging server" << std::endl;
close(logSocket);
return;
}
// Send server identifier
send(logSocket, serverId.c_str(), serverId.size(), 0);
// Send log message
send(logSocket, message.c_str(), message.size(), 0);
close(logSocket);
}
// Function to retrieve system information
void getSystemInfo(std::string& response, const std::string& unit) {
struct sysinfo info;
if (sysinfo(&info) != 0) {
response += "Error retrieving system information.\n";
return;
}
long totalMemory = info.totalram; // Total physical memory in bytes
long freeMemory = info.freeram; // Free physical memory in bytes
// Convert to the selected unit of measurement
if (unit == "mb") {
totalMemory /= (1024 * 1024);
freeMemory /= (1024 * 1024);
response += "Total physical memory: " + std::to_string(totalMemory) + " MB\n";
response += "Free physical memory: " + std::to_string(freeMemory) + " MB\n";
} else if (unit == "gb") {
totalMemory /= (1024 * 1024 * 1024);
freeMemory /= (1024 * 1024 * 1024);
response += "Total physical memory: " + std::to_string(totalMemory) + " GB\n";
response += "Free physical memory: " + std::to_string(freeMemory) + " GB\n";
} else {
response += "Total physical memory: " + std::to_string(totalMemory) + " bytes\n";
response += "Free physical memory: " + std::to_string(freeMemory) + " bytes\n";
}
}
// Function to get the current time
std::string getCurrentTime() {
time_t now = time(0);
char buffer[80];
struct tm tstruct;
localtime_r(&now, &tstruct); // Use localtime_r for thread safety
strftime(buffer, sizeof(buffer), "%Y-%m-%d %X", &tstruct);
return std::string(buffer);
}
// Function to handle a client
void handleClient(int clientSocket) {
sendLog("Client connected", "server2");
char unitBuffer[10];
recv(clientSocket, unitBuffer, sizeof(unitBuffer) - 1, 0);
unitBuffer[sizeof(unitBuffer) - 1] = '\0'; // Null-terminate the string
std::string unit(unitBuffer);
std::string response;
getSystemInfo(response, unit);
response += "Current time: " + getCurrentTime() + "\n";
send(clientSocket, response.c_str(), response.size(), 0);
sendLog("Client request processed", "server2");
close(clientSocket);
std::cout << "Connection with the client closed." << std::endl;
sendLog("Connection with the client closed", "server2");
}
int main() {
sendLog("Server 2 started", "server2");
int serverSocket = socket(AF_INET, SOCK_STREAM, 0);
if (serverSocket < 0) {
std::cerr << "Error creating socket" << std::endl;
sendLog("Error creating socket", "server2");
return 1;
}
struct sockaddr_in serverAddress;
serverAddress.sin_family = AF_INET;
serverAddress.sin_addr.s_addr = INADDR_ANY;
serverAddress.sin_port = htons(8082);
if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) < 0) {
std::cerr << "Error binding socket" << std::endl;
sendLog("Error binding socket", "server2");
close(serverSocket);
return 1;
}
listen(serverSocket, 5);
std::cout << "Server started and waiting for connections on port 8082..." << std::endl;
sendLog("Server waiting for connections on port 8082", "server2");
while (true) {
int clientSocket = accept(serverSocket, nullptr, nullptr);
if (clientSocket < 0) {
std::cerr << "Error accepting connection" << std::endl;
sendLog("Error accepting connection", "server2");
continue;
}
std::cout << "Client connected!" << std::endl;
// Create a new thread to handle the client
std::thread clientThread(handleClient, clientSocket);
clientThread.detach(); // Detach the thread to allow it to run independently
}
close(serverSocket);
return 0;
}
