keker123

Untitled

Sep 18th, 2024
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.03 KB | None | 0 0
  1. #include <iostream>
  2. #include <thread>
  3. #include <mutex>
  4. #include <vector>
  5. #include <cstring>
  6. #include <netinet/in.h>
  7. #include <unistd.h>
  8.  
  9. // Функция для длительных вычислений (здесь просто пример)
  10. std::vector<int> compute(const std::vector<int>& data) {
  11.     std::this_thread::sleep_for(std::chrono::seconds(10)); // Эмуляция длительных вычислений
  12.     std::vector<int> result = data; // Здесь можно вставить реальную логику
  13.     for (auto& val : result) {
  14.         val *= 2; // Пример вычисления
  15.     }
  16.     return result;
  17. }
  18.  
  19. // Глобальные переменные для синхронизации состояния вычислений
  20. std::mutex compute_mutex;
  21. bool is_computation_done = false;
  22. std::vector<int> computation_result;
  23.  
  24. // Функция для обработки клиента
  25. void handle_client(int client_socket) {
  26.     while (true) {
  27.         char request_type;
  28.         ssize_t read_size = recv(client_socket, &request_type, sizeof(request_type), 0);
  29.         if (read_size <= 0) {
  30.             std::cerr << "Connection closed or error occurred\n";
  31.             break;
  32.         }
  33.  
  34.         if (request_type == 0) {
  35.             // Клиент отправляет данные для вычислений
  36.             int data_size;
  37.             recv(client_socket, &data_size, sizeof(data_size), 0);
  38.  
  39.             std::vector<int> data(data_size);
  40.             recv(client_socket, data.data(), data_size * sizeof(int), 0);
  41.  
  42.             std::thread([data]() {
  43.                 std::lock_guard<std::mutex> lock(compute_mutex);
  44.                 computation_result = compute(data);
  45.                 is_computation_done = true;
  46.             }).detach();
  47.  
  48.             std::cout << "Received data for computation\n";
  49.         } else if (request_type == 1) {
  50.             // Клиент спрашивает о состоянии вычислений
  51.             std::lock_guard<std::mutex> lock(compute_mutex);
  52.             if (is_computation_done) {
  53.                 int result_size = computation_result.size();
  54.                 send(client_socket, &result_size, sizeof(result_size), 0);
  55.                 send(client_socket, computation_result.data(), result_size * sizeof(int), 0);
  56.                 std::cout << "Sent computation result to client\n";
  57.             } else {
  58.                 int not_ready = -1;
  59.                 send(client_socket, &not_ready, sizeof(not_ready), 0);
  60.                 std::cout << "Computation not done yet\n";
  61.             }
  62.         }
  63.     }
  64.  
  65.     close(client_socket);
  66. }
  67.  
  68. int main() {
  69.     int server_socket;
  70.     struct sockaddr_in server_addr, client_addr;
  71.     socklen_t client_addr_len = sizeof(client_addr);
  72.  
  73.     // Создание серверного сокета
  74.     server_socket = socket(AF_INET, SOCK_STREAM, 0);
  75.     if (server_socket < 0) {
  76.         std::cerr << "Failed to create socket\n";
  77.         return 1;
  78.     }
  79.  
  80.     // Параметры адреса сервера
  81.     server_addr.sin_family = AF_INET;
  82.     server_addr.sin_addr.s_addr = INADDR_ANY;
  83.     server_addr.sin_port = htons(8080);
  84.  
  85.     // Привязка сокета к порту
  86.     if (bind(server_socket, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
  87.         std::cerr << "Bind failed\n";
  88.         return 1;
  89.     }
  90.  
  91.     // Ожидание подключения клиентов
  92.     listen(server_socket, 5);
  93.     std::cout << "Server listening on port 8080\n";
  94.  
  95.     while (true) {
  96.         // Принятие подключения
  97.         int client_socket = accept(server_socket, (struct sockaddr*)&client_addr, &client_addr_len);
  98.         if (client_socket < 0) {
  99.             std::cerr << "Failed to accept connection\n";
  100.             continue;
  101.         }
  102.  
  103.         std::cout << "Client connected\n";
  104.         std::thread(handle_client, client_socket).detach(); // Обработка клиента в отдельном потоке
  105.     }
  106.  
  107.     close(server_socket);
  108.     return 0;
  109. }
  110.  
Advertisement
Add Comment
Please, Sign In to add comment