#pragma once #include "ASIO_Utils.h" #include #include #include namespace Psc::asio_socket { class UDP_Server { public: void set_bind_address(const Sockaddr_In& addr) { bind_address = addr; } void set_bind_address(const std::string& ip, std::uint32_t port) { bind_address = Sockaddr_In(ip, port); } [[nodiscard]] std::string to_string() const { return bind_address.to_string(); } void create(); bool bind(); void tick(); void close(); void reply_last_peer(const std::string& data); void send_to(const std::string& ip, uint16_t port, const std::string& data); void write_to_all_clients(const std::string& msg); struct Read_Info { Sockaddr_In peer; std::string data; }; std::vector read(); enum State { Not_Created, Not_Set_Field, Not_Bind, Working, }; State state = Not_Created; Sockaddr_In bind_address; std::vector clients; Socket_FD socket_fd = static_cast(-1); bool bound = false; int read_chunk_size = 1024 * 1024; Sockaddr_In last_peer{}; bool has_last_peer = false; size_t buffer_size = 4096 * 10; private: asio::io_context io_context; std::unique_ptr socket; asio::ip::udp::endpoint recv_endpoint; ASIO_PacketRingBuffer recv_buffer; ASIO_PacketRingBuffer send_buffer; std::vector recv_peers; std::vector send_endpoints; std::vector recv_storage; std::vector send_storage; bool read_pending = false; bool write_pending = false; void start_read(); void start_write(); }; } // namespace Psc::asio_socket