ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
Connection.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
8 #include "io/rpc/Connection.h"
9 
10 #include <Logging.h>
11 
12 #include <zmq.hpp>
13 
14 #include "io/rpc/ZMQContext.h"
15 
16 using namespace cloudViewer::utility;
17 
18 namespace {
19 
20 struct ConnectionDefaults {
21  std::string address = "tcp://127.0.0.1:51454";
22  int connect_timeout = 5000;
23  int timeout = 10000;
24 } defaults;
25 
26 } // namespace
27 
28 namespace cloudViewer {
29 namespace io {
30 namespace rpc {
31 
32 Connection::Connection()
33  : Connection(defaults.address, defaults.connect_timeout, defaults.timeout) {
34 }
35 
36 Connection::Connection(const std::string& address,
37  int connect_timeout,
38  int timeout)
39  : context_(GetZMQContext()),
40  socket_(new zmq::socket_t(*GetZMQContext(), ZMQ_REQ)),
41  address_(address),
42  connect_timeout_(connect_timeout),
43  timeout_(timeout) {
44  socket_->set(zmq::sockopt::linger, timeout_);
45  socket_->set(zmq::sockopt::connect_timeout, connect_timeout_);
46  socket_->set(zmq::sockopt::rcvtimeo, timeout_);
47  socket_->set(zmq::sockopt::sndtimeo, timeout_);
48  socket_->connect(address_.c_str());
49 }
50 
51 Connection::~Connection() { socket_->close(); }
52 
53 std::shared_ptr<zmq::message_t> Connection::Send(zmq::message_t& send_msg) {
54  if (!socket_->send(send_msg, zmq::send_flags::none)) {
55  zmq::error_t err;
56  if (err.num()) {
57  LogInfo("Connection::send() send failed with: {}", err.what());
58  }
59  }
60 
61  std::shared_ptr<zmq::message_t> msg(new zmq::message_t());
62  if (socket_->recv(*msg)) {
63  LogDebug("Connection::send() received answer with {} bytes",
64  msg->size());
65  } else {
66  zmq::error_t err;
67  if (err.num()) {
68  LogInfo("Connection::send() recv failed with: {}", err.what());
69  }
70  }
71  return msg;
72 }
73 
74 std::shared_ptr<zmq::message_t> Connection::Send(const void* data,
75  size_t size) {
76  zmq::message_t send_msg(data, size);
77  return Send(send_msg);
78 }
79 
80 std::string Connection::DefaultAddress() { return defaults.address; }
81 
82 } // namespace rpc
83 } // namespace io
84 } // namespace cloudViewer
int size
std::shared_ptr< zmq::message_t > Send(zmq::message_t &send_msg)
Function for sending data wrapped in a zmq message object.
Definition: Connection.cpp:53
static std::string DefaultAddress()
Definition: Connection.cpp:80
Connection()
Creates a connection with the default parameters.
Definition: Connection.cpp:32
#define LogInfo(...)
Definition: Logging.h:81
#define LogDebug(...)
Definition: Logging.h:90
std::shared_ptr< zmq::context_t > GetZMQContext()
Returns the zeromq context for this process.
Definition: ZMQContext.cpp:22
Generic file read and write utility for python interface.