UDPServer.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. #pragma once
  2. #include <cstdlib>
  3. #include <iostream>
  4. #include "asio.hpp"
  5. #include "HDDSNetDefine.h"
  6. #include "CustomLog.h"
  7. using asio::ip::udp;
  8. // 定义目标端点结构
  9. struct UDPTarget {
  10. std::string ip;
  11. int port;
  12. udp::endpoint endpoint;
  13. bool resolved; // 是否已解析
  14. };
  15. class UDPServer {
  16. public:
  17. UDPServer(asio::io_context& io_context, unsigned short nPort)
  18. : io_context_(io_context)
  19. , nPort_(nPort)
  20. {
  21. m_pCMDQueue = nullptr;
  22. // 延迟创建 socket,确保线程安全
  23. init_socket();
  24. }
  25. ~UDPServer(void);
  26. void init_socket();
  27. void setCMDQueue(HDDSCMDQueue* pQueue);
  28. void setSendParam(const char* hostIP, int nPort);
  29. void start_receive();
  30. void handle_receive(std::error_code ec, std::size_t bytes_recvd);
  31. int blockingSendData(LPHDDSCMD pData, long DataLen);
  32. int asyncSendData(LPHDDSCMD pData, long DataLen);
  33. // 新增接口:设置多个目标
  34. void setMultiSendParams(const std::vector<UDPTarget>& targets);
  35. void addSendTarget(const char* hostIP, int nPort);
  36. void removeSendTarget(const char* hostIP, int nPort);
  37. void clearSendTargets();
  38. // 新增接口:发送到多个目标
  39. int blockingSendDataToMulti(LPHDDSCMD pData, long DataLen);
  40. int asyncSendDataToMulti(LPHDDSCMD pData, long DataLen);
  41. private:
  42. UDPServer(void) = delete;
  43. UDPServer(const UDPServer&) = delete;
  44. const UDPServer& operator=(const UDPServer&) = delete;
  45. asio::io_context& io_context_;
  46. unsigned short nPort_;
  47. std::unique_ptr<udp::socket> socket_;
  48. udp::endpoint remote_endpoint_;
  49. udp::resolver::results_type endpoint_;
  50. std::unique_ptr<udp::resolver> resolver_;
  51. char sendData[max_length + 12];
  52. char data[max_length + 12];
  53. HDDSCMDQueue* m_pCMDQueue;
  54. // 解析单个目标地址
  55. bool resolveTarget(UDPTarget& target);
  56. // 解析所有未解析的目标
  57. void resolveAllTargets();
  58. // 新增多个目标相关
  59. std::vector<UDPTarget> multi_targets_;
  60. std::mutex targets_mutex_; // 保护 multi_targets_
  61. };