Files
CPP_Core/Core/socket/UDP_Server.h
T
2026-07-24 10:54:45 +08:00

62 lines
1.7 KiB
C++

#pragma once
#include <deque>
#include <memory>
#include <string_view>
#include <vector>
#include "ASIO_Utils.h"
namespace Psc::asio_socket {
class UDP_Server {
public:
void set_bind_address(const Sockaddr_In& addr) {
bind_address = addr;
}
void set_bind_address(std::string_view 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(std::string_view data);
void send_to(std::string_view ip, uint16_t port, std::string_view data);
void write_to_all_clients(std::string_view msg);
struct Read_Info {
Sockaddr_In peer;
std::string data;
};
std::vector<Read_Info> read();
enum State {
Not_Created,
Not_Set_Field,
Not_Bind,
Working,
};
State state = Not_Created;
Sockaddr_In bind_address;
std::vector<Sockaddr_In> clients;
Socket_FD socket_fd = static_cast<Socket_FD>(-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<asio::ip::udp::socket> socket;
asio::ip::udp::endpoint recv_endpoint;
ASIO_PacketRingBuffer recv_buffer;
ASIO_PacketRingBuffer send_buffer;
std::vector<Sockaddr_In> recv_peers;
std::vector<asio::ip::udp::endpoint> send_endpoints;
std::vector<char> recv_storage;
std::vector<char> send_storage;
bool read_pending = false;
bool write_pending = false;
void start_read();
void start_write();
};
} // namespace Psc::asio_socket