#pragma once #include #include #include "zmq.hpp" #include "IVrZeroMQClient.h" #ifdef _DEBUG #pragma comment(lib, "libzmq-v142-mt-gd-4_3_5.lib") #else #pragma comment(lib, "libzmq-v142-mt-4_3_5.lib") #endif // _DEBUG #define TCP_TRANSFER_PORT 8800 #define MAX_BUF_LEN 1024 class CVrZeroMQClient : public IVrZeroMQClient { public: CVrZeroMQClient(); ~CVrZeroMQClient(); // 初始化 int Init(const char* sIP, int nPort) override; // 发送数据 int SendAndWaitBack(const char* pdata, const int nLen, char** ppRecvData, size_t& nRecvLen) override; // 关闭通信 int UnInit() override; private: // 创建并配置一个新的 REQ socket(统一所有低延迟 + 超时选项)。调用方需持有 m_mutexObj。 void createSocketLocked(); // 关闭并重建 REQ socket,若已 Init 过则重新连接。 // REQ 是严格 send-recv 交替状态机,recv 超时后必须重建才能恢复后续命令。调用方需持有 m_mutexObj。 void rebuildSocketLocked(); private: zmq::context_t* m_pContext{nullptr}; zmq::socket_t* m_pSocket{nullptr}; zmq::message_t m_recvmsg; std::mutex m_mutexObj; std::string m_sAddr; // 已连接的 tcp://ip:port,供超时重建后重连使用 };