server.h 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include <iostream>
  2. #include <vector>
  3. #include <string>
  4. #include <thread>
  5. #include <mutex>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <stdarg.h>
  9. #include <string.h>
  10. #include <signal.h>
  11. #include <sys/types.h>
  12. #include <errno.h>
  13. #include <ctype.h>
  14. #include <unistd.h>
  15. #include <sys/socket.h>
  16. #include <netinet/in.h>
  17. #include <arpa/inet.h>
  18. #include <sys/uio.h>
  19. #include <sys/time.h>
  20. struct ClientData {
  21. int sockd; // Файловый дескриптор соединения. Используем его для обмена данными с клиентом
  22. struct sockaddr_in client_sockaddr; // Сведения о клиенте
  23. socklen_t client_sockaddr_size;
  24. };
  25. class Server {
  26. public:
  27. Server() = default;
  28. int exec(); // Основная функция сервера. Запускает сервер и осуществляет обмен сообщениями
  29. private:
  30. bool createSocket(); // Функция инициализирует сокет сервера и переводит его в режим ожидания соединений.
  31. // Возвращает true, если инициализация удалась, иначе - false;
  32. void handleRequest(ClientData* client_data); // Функция обработки соединения с клиентом. Осуществляет обмен данными с конкретным клиентом.
  33. private:
  34. const uint32_t port = 12346; // Номер порта, по которому происходят соединения читателей
  35. const uint32_t max_connections = 1000; // Максимальное количество одновременных соединений
  36. int sock; // сокет сервера
  37. std::vector<ClientData> clients_readers; // Храним массив с клиентами-читателями, т.к. любой писатель должен знать обо всех читателях
  38. std::mutex client_readers_lock; // Используем мьютекс для массива читателей, чтобы исключить одновременные
  39. // чтение-запись для массива (например: появление новых читателей
  40. // и "публикации" писателей могут происходить одновременно)
  41. std::vector<std::thread> clients_threads; // Каждое соединение с сервером обрабатывается в отдельном потоке
  42. };