std::vector<T> request(const char * sink, int lines = 1) { std::stringstream lines_s; lines_s << lines; zmq_send(zmq_requester, "RQD", 3, ZMQ_SNDMORE); zmq_send(zmq_requester, sink, strlen(sink), ZMQ_SNDMORE); zmq_send(zmq_requester, lines_s.str().c_str(), lines_s.str().size(), 0); zmq_msg_t reply; zmq_msg_init(&reply); int reply_size = zmq_msg_recv(&reply, zmq_requester, 0); if(reply_size < 0) { std::cout << "adaptor: request data: reply error " << errno << std::endl; } std::vector<T> reply_v; if(reply_size>0) { std::string reply_str((char*)zmq_msg_data(&reply),reply_size); std::stringstream reply_s(reply_str); while(!reply_s.eof()) { T t; reply_s >> t; reply_v.push_back(t); } }
int retrieve_status(const std::string & hostname, uint16_t port, const std::string & request_str, int timeout) { void *context = zmq_ctx_new(); void *socket = zmq_socket(context, ZMQ_REQ); int linger = 0; zmq_setsockopt(socket, ZMQ_LINGER, &linger, sizeof(int)); std::string connect_str = "tcp://" + hostname + ":" + std::to_string(port); zmq_connect(socket, connect_str.c_str()); zmq_send(socket, request_str.c_str(), request_str.size(), 0); zmq_pollitem_t items[] = { {socket, 0, ZMQ_POLLIN, 0} }; if (zmq_poll(items, 1, timeout) > 0) { zmq_msg_t msg; zmq_msg_init(&msg); if (zmq_msg_recv(&msg, socket, 0) != -1) { std::string reply_str((char *)zmq_msg_data(&msg), zmq_msg_size(&msg)); printf("%s\n", reply_str.c_str()); return 0; } else { return 1; } } else { return 1; } }
std::string send_command(command c, const char * arg = NULL) { switch(c) { case DAT: zmq_send(zmq_requester, "DAT", 3, ZMQ_SNDMORE); zmq_send(zmq_requester, arg, strlen(arg), 0); break; case RQF: zmq_send(zmq_requester, "RQF", 3, ZMQ_SNDMORE); zmq_send(zmq_requester, arg, strlen(arg), 0); break; case RQJ: zmq_send(zmq_requester, "RQJ", 3, 0); break; case DNE: zmq_send(zmq_requester, "DNE", 3, 0); break; default: break; } zmq_msg_t reply; zmq_msg_init(&reply); int reply_size = zmq_msg_recv(&reply, zmq_requester, 0); if(reply_size < 0) { std::cout << "adaptor: command: " << c << ": reply error " << errno << std::endl; } if(reply_size>0) { std::string reply_str((char*)zmq_msg_data(&reply),reply_size); return reply_str; } return std::string(""); }