Advertisement
abstract_abstract

Untitled

Oct 1st, 2023
861
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.27 KB | None | 0 0
  1. #include "Server.h"
  2. #include <iostream>
  3. #include <winsock2.h>
  4. #include <ws2tcpip.h>
  5.  
  6. #pragma comment(lib, "ws2_32.lib")
  7.  
  8. Server::Server(const std::string& address, int port)
  9.         : address(address), port(port), connected(false), serverSocket(0), clientSocket(0) {
  10.     WSADATA wsaData;
  11.     if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
  12.         std::cerr << "Ошибка при инициализации библиотеки WSA" << std::endl;
  13.         return;
  14.     }
  15.  
  16. // Создание сокета
  17.     serverSocket = socket(AF_INET, SOCK_STREAM, 0);
  18.     if (serverSocket == INVALID_SOCKET) {
  19.         std::cerr << "Ошибка при создании сокета" << std::endl;
  20.         WSACleanup();
  21.         return;
  22.     }
  23.  
  24. // Настройка адреса и порта сервера
  25.     sockaddr_in serverAddress{};
  26.     serverAddress.sin_family = AF_INET;
  27.     serverAddress.sin_port = htons(port);
  28.  
  29.     if (inet_pton(AF_INET, address.c_str(), &(serverAddress.sin_addr)) <= 0) {
  30.         std::cerr << "Некорректный адрес сервера" << std::endl;
  31.         closesocket(serverSocket);
  32.         WSACleanup();
  33.         return;
  34.     }
  35.  
  36. // Привязка сокета к адресу и порту
  37.     if (bind(serverSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress)) == SOCKET_ERROR) {
  38.         std::cerr << "Ошибка при привязке сокета" << std::endl;
  39.         closesocket(serverSocket);
  40.         WSACleanup();
  41.         return;
  42.     }
  43.  
  44. // Ожидание подключений
  45.     if (listen(serverSocket, 1) == SOCKET_ERROR) {
  46.         std::cerr << "Ошибка при ожидании подключений" << std::endl;
  47.         closesocket(serverSocket);
  48.         WSACleanup();
  49.         return;
  50.     }
  51.  
  52.     std::cout << "Сервер запущен и ожидает подключений..." << std::endl;
  53.     connected = true;
  54. }
  55.  
  56. Server::~Server() {
  57.     if (connected) {
  58.         // Остановка сервера
  59.  
  60.         connected = false;
  61.         std::cout << "Сервер успешно остановлен из деструктора" << std::endl;
  62.     }
  63. }
  64.  
  65. void Server::start() {
  66.     if (!connected) {
  67.         std::cerr << "Сервер не был успешно запущен" << std::endl;
  68.         return;
  69.     }
  70.  
  71.     while (true) {
  72.         sockaddr_in clientAddress{};
  73.         int clientAddressLen = sizeof(clientAddress);
  74.  
  75.         // Принятие нового подключения
  76.         clientSocket = accept(serverSocket, (struct sockaddr*)&clientAddress, &clientAddressLen);
  77.         if (clientSocket == INVALID_SOCKET) {
  78.             std::cerr << "Ошибка при принятии подключения" << std::endl;
  79.             continue;
  80.         }
  81.  
  82.         char clientIp[INET_ADDRSTRLEN];
  83.         inet_ntop(AF_INET, &(clientAddress.sin_addr), clientIp, INET_ADDRSTRLEN);
  84.         int clientPort = ntohs(clientAddress.sin_port);
  85.  
  86.         std::cout << "Получено новое соединение от " << clientIp << ":" << clientPort << std::endl;
  87.  
  88.         // Ваш код для обработки подключения
  89.  
  90.         // Закрытие сокета клиента
  91.         closesocket(clientSocket);
  92.         std::cout << "Соединение с " << clientIp << ":" << clientPort << " завершено" << std::endl;
  93.     }
  94. }
  95.  
  96.  
  97. void Server::stop() {
  98.     if (connected) {
  99.         // Остановка сервера
  100.  
  101.         // Закрытие клиентского сокета (если активно)
  102.         if (clientSocket != 0) {
  103.             closesocket(clientSocket);
  104.             clientSocket = 0;
  105.         }
  106.  
  107.         // Закрытие серверного сокета
  108.         closesocket(serverSocket);
  109.         WSACleanup();
  110.  
  111.         connected = false;
  112.         std::cout << "Сервер успешно остановлен" << std::endl;
  113.     } else {
  114.         std::cerr << "Сервер не был запущен" << std::endl;
  115.     }
  116. }
  117.  
  118.  
  119. bool Server::isConnected() const {
  120.     return connected;
  121. }
  122.  
  123. bool Server::isRunning() const {
  124.     if (connected) {
  125.         if(serverSocket != 0) {
  126.             return true;
  127.         } else {
  128.             return false;
  129.         }
  130.     } else {
  131.         return false;
  132.     }
  133. }
  134.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement