vibes
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user