This commit is contained in:
Ivan I. Ovchinnikov
2026-05-28 22:26:46 +03:00
parent 0d249a72a4
commit 7d71515d22
8 changed files with 360 additions and 22 deletions
@@ -1,6 +1,56 @@
#ifndef NETWORK_LIBRARY_H
#define NETWORK_LIBRARY_H
void hello();
#pragma once
#include "ServerSocketListener.h"
#include "ServerSocketWrapper.h"
#include <thread>
#include <atomic>
#include <memory>
#include <chrono>
namespace iovi_space::network {
/**
* @brief Поток серверного сокета.
* Аналог Java ServerSocketThread.
*
* Запускает внутренний std::thread, который ожидает подключения
* и делегирует события через ServerSocketListener.
*/
class ServerSocket {
public:
/**
* @param listener Указатель на реализацию интерфейса (не владеет)
* @param name Имя потока (для отладки)
* @param port Порт для прослушивания
* @param timeout_ms Таймаут accept() в миллисекундах
*/
ServerSocket(ServerSocketListener* listener, const std::string& name, int port, int timeout_ms);
~ServerSocket();
// Остановка сервера (аналог interrupt() в Java)
void stop();
[[nodiscard]] bool isRunning() const { return running_.load(); }
[[nodiscard]] int getPort() const { return port_; }
private:
void run(); // Точка входа потока
ServerSocketListener* listener_; // Не владеет
std::string name_;
int port_;
int timeout_ms_;
std::thread worker_;
std::atomic<bool> running_{false};
std::atomic<bool> stop_requested_{false};
ServerSocketWrapper listenSocket_;
};
} // namespace iovi_space::network
#endif // NETWORK_LIBRARY_H
@@ -0,0 +1,35 @@
//
// Created by ovchinnikov-ii on 5/28/26.
//
#ifndef NETWORK_SERVERSOCKETLISTENER_H
#define NETWORK_SERVERSOCKETLISTENER_H
#include <memory>
#include <system_error>
namespace iovi_space::network {
// Forward declaration
class ServerSocket;
class ServerSocketWrapper;
/**
* @brief Абстрактный интерфейс слушателя событий сервера.
* Аналог Java ServerSocketThreadListener.
*/
class ServerSocketListener {
public:
virtual ~ServerSocketListener() = default;
virtual void onServerStart(ServerSocket* server) = 0;
virtual void onServerStop(ServerSocket* server) = 0;
virtual void onServerSocketCreated(ServerSocket* server, const ServerSocketWrapper& listenSocket) = 0;
virtual void onServerTimeout(ServerSocket* server, const ServerSocketWrapper& listenSocket) = 0;
virtual void onSocketAccepted(ServerSocket* server, const ServerSocketWrapper& listenSocket, std::unique_ptr<ServerSocketWrapper> clientSocket) = 0;
virtual void onServerException(ServerSocket* server, const std::system_error& error) = 0;
};
} // namespace iovi_space::network
#endif //NETWORK_SERVERSOCKETLISTENER_H
@@ -5,4 +5,56 @@
#ifndef NETWORK_SERVERSOCKETWRAPPER_H
#define NETWORK_SERVERSOCKETWRAPPER_H
#include <string>
#include <memory>
#ifdef _WIN32
#include <winsock2.h>
#include <ws2tcpip.h>
using SocketHandle = SOCKET;
constexpr SocketHandle INVALID_SOCKET_HANDLE = INVALID_SOCKET;
#else
#include <sys/socket.h>
#include <unistd.h>
#include <fcntl.h>
using SocketHandle = int;
constexpr SocketHandle INVALID_SOCKET_HANDLE = -1;
#endif
namespace iovi_space::network {
/**
* @brief RAII-обёртка над нативным сокетом.
* Автоматически закрывает сокет при разрушении.
*/
class ServerSocketWrapper {
public:
ServerSocketWrapper() : handle_(INVALID_SOCKET_HANDLE) {}
explicit ServerSocketWrapper(SocketHandle handle) : handle_(handle) {}
// Запрет копирования, разрешение перемещения
ServerSocketWrapper(const ServerSocketWrapper&) = delete;
ServerSocketWrapper& operator=(const ServerSocketWrapper&) = delete;
ServerSocketWrapper(ServerSocketWrapper&& other) noexcept;
ServerSocketWrapper& operator=(ServerSocketWrapper&& other) noexcept;
~ServerSocketWrapper();
[[nodiscard]] bool isValid() const { return handle_ != INVALID_SOCKET_HANDLE; }
[[nodiscard]] SocketHandle get() const { return handle_; }
// Сброс владения (для передачи сырого дескриптора)
[[nodiscard]] SocketHandle release();
// Утилиты
void setNonBlocking(bool enable);
void setReceiveTimeout(int milliseconds);
[[nodiscard]] std::string getPeerAddress() const;
private:
SocketHandle handle_;
};
} // namespace iovi_space::network
#endif //NETWORK_SERVERSOCKETWRAPPER_H