| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- #pragma once
- #include <cstdlib>
- #include <iostream>
- #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<UDPTarget>& 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<udp::socket> socket_;
- udp::endpoint remote_endpoint_;
- udp::resolver::results_type endpoint_;
- std::unique_ptr<udp::resolver> resolver_;
- char sendData[max_length + 12];
- char data[max_length + 12];
- HDDSCMDQueue* m_pCMDQueue;
- // 解析单个目标地址
- bool resolveTarget(UDPTarget& target);
- // 解析所有未解析的目标
- void resolveAllTargets();
- // 新增多个目标相关
- std::vector<UDPTarget> multi_targets_;
- std::mutex targets_mutex_; // 保护 multi_targets_
- };
|