#pragma once #include "ASIO_Utils.h" #include "Core/Statistics/Statistics.h" #include #include #include #include namespace Psc::asio_socket { class TCP_Connect { public: Accept_Info info; std::shared_ptr socket; ASIO_StreamRingBuffer send_buffer; ASIO_StreamRingBuffer recv_buffer; Speed_Statistics push_speed; Speed_Statistics lose_speed; Value_Statistics send_num; std::array recv_storage{}; std::vector send_storage; bool read_pending = false; bool write_pending = false; bool closing = false; [[nodiscard]] std::string to_string() const { return info.to_string(); } }; class TCP_Server : public Socket_Base { public: ~TCP_Server() override; void tick(); TCP_Server& set_tcp_no_delay(bool no_delay); void close() override; TCP_Server& create(); TCP_Server& set_connect_system_buffer_size(size_t size); TCP_Server& set_connect_user_buffer_size(size_t size); TCP_Server& set_recv_system_buffer_size(size_t size); bool listen(const std::string& ip, std::uint32_t port); bool listen(const Sockaddr_In& address); std::string to_string() override; void write_to_all_clients(const std::string& data); struct Read_Info { Accept_Info info; std::string data; }; enum State { Not_Created, Not_Set_Field, Not_bind, Not_Listen, Working }; State state = Not_Created; std::vector read_from_all_clients(); std::vector client_fds(); std::vector> get_all_clients(); void flush_clients(); [[nodiscard]] std::shared_ptr accept() const; protected: mutable asio::io_context io_context; std::unique_ptr acceptor; std::map> tcp_clients; size_t connect_user_buffer_size = 1024 * 1024; size_t connect_system_buffer_size = 4096 * 10; size_t max_pending_send_bytes = 1024 * 1024; size_t recv_system_buffer_size = 1024 * 1024; bool no_delay = true; bool accept_pending = false; std::shared_ptr pending_accept_socket; mutable std::vector> accepted_clients; void start_accept(); void start_read(const std::shared_ptr& conn); void start_write(const std::shared_ptr& conn); void close_client(const std::shared_ptr& conn); void cleanup_closed_clients(); }; } // namespace Psc::asio_socket