我试图通过每 1 秒轮询一次服务器来查看
ZMQ_REP
服务器是否已准备好使用以下代码与客户端进行通信,但它永远不会返回 true
,尽管服务器已启动并正在运行以侦听客户端。
#include <iostream>
#include <zmq.hpp>
#include <chrono>
const std::string SERVER_ENDPOINT = "tcp://localhost:5555";
bool checkServer(const std::string& serverEndpoint) {
zmq::context_t context(1);
zmq::socket_t socket(context, zmq::SocketType::REQ);
socket.connect(serverEndpoint);
zmq::pollitem_t items [] = {{ socket, 0, ZMQ_POLLIN, 0 }};
zmq::poll(items, 1, 1000); // 1 second timeout
if (items[0].revents & ZMQ_POLLIN) {
return true; // If server is available
}
return false;
}
int main() {
bool serverAvailable = false;
while (!serverAvailable) {
std::cout << "Waiting for server..." << std::endl;
serverAvailable = checkServer(SERVER_ENDPOINT);
std::this_thread::sleep_for(std::chrono::seconds(1));
}
std::cout << "Server is available." << std::endl;
return 0;
}
如果有人能够阐明这个问题,我将不胜感激。
在您的示例中,您创建一个
ZMQ_REQ
套接字,连接它,然后等待传入消息。这将不起作用,因为您的 ZMQ_REP
服务器(未看到代码)必须首先从 ZMQ_REQ
套接字接收消息才能发送。
作为示例,您可以将多个
ZMQ_REQ
客户端连接到一台 ZMQ_REP
服务器。在内部,每个客户端都有自己的路由 ID,服务器使用它来将回复定向到正确的客户端。