Files
CPP_Core/Core/socket/TCP_Server.h
T
2026-06-23 09:35:27 +08:00

90 lines
2.6 KiB
C++

#pragma once
#include "ASIO_Utils.h"
#include "Core/Statistics/Statistics.h"
#include <array>
#include <map>
#include <memory>
#include <vector>
namespace Psc::asio_socket {
class TCP_Connect {
public:
Accept_Info info;
std::shared_ptr<asio::ip::tcp::socket> socket;
ASIO_StreamRingBuffer send_buffer;
ASIO_StreamRingBuffer recv_buffer;
Speed_Statistics push_speed;
Speed_Statistics lose_speed;
Value_Statistics send_num;
std::array<char, 16 * 1024> recv_storage{};
std::vector<char> 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_Info> read_from_all_clients();
std::vector<Socket_FD> client_fds();
std::vector<std::shared_ptr<TCP_Connect>> get_all_clients();
void flush_clients();
[[nodiscard]] std::shared_ptr<TCP_Connect> accept() const;
protected:
mutable asio::io_context io_context;
std::unique_ptr<asio::ip::tcp::acceptor> acceptor;
std::map<Socket_FD, std::shared_ptr<TCP_Connect>> 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<asio::ip::tcp::socket> pending_accept_socket;
mutable std::vector<std::weak_ptr<TCP_Connect>> accepted_clients;
void start_accept();
void start_read(const std::shared_ptr<TCP_Connect>& conn);
void start_write(const std::shared_ptr<TCP_Connect>& conn);
void close_client(const std::shared_ptr<TCP_Connect>& conn);
void cleanup_closed_clients();
};
} // namespace Psc::asio_socket