#pragma once #include #include #include "asio.hpp" #include "HDDSNetDefine.h" #include "CustomLog.h" using asio::ip::udp; // 定义目标端点结构 struct UDPTarget { std::string ip; int port; udp::endpoint endpoint; bool resolved; // 是否已解析 }; class UDPServer { public: UDPServer(asio::io_context& io_context, unsigned short nPort) : io_context_(io_context) , nPort_(nPort) { m_pCMDQueue = nullptr; // 延迟创建 socket,确保线程安全 init_socket(); } ~UDPServer(void); void init_socket(); void setCMDQueue(HDDSCMDQueue* pQueue); void setSendParam(const char* hostIP, int nPort); void start_receive(); void handle_receive(std::error_code ec, std::size_t bytes_recvd); int blockingSendData(LPHDDSCMD pData, long DataLen); int asyncSendData(LPHDDSCMD pData, long DataLen); // 新增接口:设置多个目标 void setMultiSendParams(const std::vector& targets); void addSendTarget(const char* hostIP, int nPort); void removeSendTarget(const char* hostIP, int nPort); void clearSendTargets(); // 新增接口:发送到多个目标 int blockingSendDataToMulti(LPHDDSCMD pData, long DataLen); int asyncSendDataToMulti(LPHDDSCMD pData, long DataLen); private: UDPServer(void) = delete; UDPServer(const UDPServer&) = delete; const UDPServer& operator=(const UDPServer&) = delete; asio::io_context& io_context_; unsigned short nPort_; std::unique_ptr socket_; udp::endpoint remote_endpoint_; udp::resolver::results_type endpoint_; std::unique_ptr resolver_; char sendData[max_length + 12]; char data[max_length + 12]; HDDSCMDQueue* m_pCMDQueue; // 解析单个目标地址 bool resolveTarget(UDPTarget& target); // 解析所有未解析的目标 void resolveAllTargets(); // 新增多个目标相关 std::vector multi_targets_; std::mutex targets_mutex_; // 保护 multi_targets_ };