RES send_request(const REQ& req, zmq::socket_t& sending_socket,
                 zmq::socket_t& receiving_socket, bool& succeed) {
  std::string serialized_req;
  req.SerializeToString(&serialized_req);
  kZmqUtil->send_string(serialized_req, &sending_socket);

  RES response;
  zmq::message_t message;

  bool recurse = recursive_receive<REQ, RES>(receiving_socket, message, req,
                                             response, succeed);

  while (recurse) {
    response.Clear();
    zmq::message_t message;
    recurse = recursive_receive<REQ, RES>(receiving_socket, message, req,
                                          response, succeed);
  }

  return response;
}