#pragma once #include "Core/Base/RingBuffer.hpp" #include "Core/Statistics/Statistics.h" #include "Socket.h" namespace Psc::socket { class TCP_Connect { public: Accept_Info info; [[nodiscard]] std::string to_string() const { return info.to_string(); } StreamRingBuffer_ST send_buffer; Speed_Statistics push_speed; Speed_Statistics lose_speed; Value_Statistics send_num; }; class TCP_Server : public Socket_Base { public: ~TCP_Server() override; 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); 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; bool listen(const Sockaddr_In &address); protected: 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; }; }