helics  2.8.1
NetworkBroker_impl.hpp
1 /*
2 Copyright (c) 2017-2021,
3 Battelle Memorial Institute; Lawrence Livermore National Security, LLC; Alliance for Sustainable
4 Energy, LLC. See the top-level NOTICE for additional details. All rights reserved.
5 SPDX-License-Identifier: BSD-3-Clause
6 */
7 #pragma once
8 
9 #include "../core/core-types.hpp"
10 #include "../core/helicsCLI11.hpp"
11 #include "NetworkBroker.hpp"
12 
13 #include <iostream>
14 #include <memory>
15 #include <string>
16 
17 namespace helics {
18 constexpr const char* tstr[] = {"default",
19  "ZeroMQ",
20  "MPI",
21  "TEST",
22  "IPC",
23  "interprocess",
24  "TCP",
25  "UDP",
26  "undef",
27  "nng",
28  "ZMQ_SS",
29  "TCPSS",
30  "undef",
31  "undef",
32  "http",
33  "unknown"};
34 
35 constexpr const char* tcodeStr(int tcode)
36 {
37  return ((tcode >= 0) && (tcode < 15)) ? tstr[tcode] : tstr[15];
38 }
39 
40 constexpr const char* defInterface[] = {"127.0.0.1",
41  "127.0.0.1",
42  "tcp://127.0.0.1",
43  "_ipc_broker",
44  ""};
45 
46 template<class COMMS, interface_type baseline, int tcode>
49 {
50  netInfo.server_mode = NetworkBrokerData::server_mode_options::server_default_active;
51 }
52 
53 template<class COMMS, interface_type baseline, int tcode>
54 NetworkBroker<COMMS, baseline, tcode>::NetworkBroker(const std::string& broker_name):
55  CommsBroker<COMMS, CoreBroker>(broker_name)
56 {
57  netInfo.server_mode = NetworkBrokerData::server_mode_options::server_default_active;
58 }
59 
60 template<class COMMS, interface_type baseline, int tcode>
61 std::shared_ptr<helicsCLI11App> NetworkBroker<COMMS, baseline, tcode>::generateCLI()
62 {
63  auto app = CoreBroker::generateCLI();
64  CLI::App_p netApp = netInfo.commandLineParser(defInterface[static_cast<int>(baseline)], false);
65  app->add_subcommand(netApp);
66  return app;
67 }
68 
69 template<class COMMS, interface_type baseline, int tcode>
71 {
72  std::lock_guard<std::mutex> lock(dataMutex);
73  if ((netInfo.brokerName.empty()) && (netInfo.brokerAddress.empty())) {
74  CoreBroker::setAsRoot();
75  }
76  netInfo.useJsonSerialization = BrokerBase::useJsonSerialization;
77  CommsBroker<COMMS, CoreBroker>::comms->setName(CoreBroker::getIdentifier());
78  CommsBroker<COMMS, CoreBroker>::comms->loadNetworkInfo(netInfo);
79  CommsBroker<COMMS, CoreBroker>::comms->setTimeout(BrokerBase::networkTimeout.to_ms());
80 
81  auto res = CommsBroker<COMMS, CoreBroker>::comms->connect();
82  if (res) {
83  if (netInfo.portNumber < 0) {
84  netInfo.portNumber = CommsBroker<COMMS, CoreBroker>::comms->getPort();
85  }
86  }
87  return res;
88 }
89 
90 template<class COMMS, interface_type baseline, int tcode>
92 {
93  std::string add;
94  if (CommsBroker<COMMS, CoreBroker>::comms->isConnected()) {
95  add = CommsBroker<COMMS, CoreBroker>::comms->getAddress();
96  } else {
97  std::lock_guard<std::mutex> lock(dataMutex);
98  switch (baseline) {
99  case interface_type::tcp:
100  case interface_type::ip:
101  case interface_type::udp:
102  if (!netInfo.localInterface.empty() && (netInfo.localInterface.back() == '*')) {
103  add = makePortAddress(
104  netInfo.localInterface.substr(0, netInfo.localInterface.size() - 1),
105  netInfo.portNumber);
106  } else {
107  add = makePortAddress(netInfo.localInterface, netInfo.portNumber);
108  }
109  break;
110  case interface_type::inproc:
111  case interface_type::ipc:
112  default:
113  if (!netInfo.localInterface.empty()) {
114  add = netInfo.localInterface;
115  } else {
116  add = CoreBroker::getIdentifier();
117  }
118  break;
119  }
120  }
121  return add;
122 }
123 
124 } // namespace helics
helics::NetworkBroker
Definition: NetworkBroker.hpp:18
helics::CommsBroker< COMMS, CoreBroker >
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
helics::NetworkBroker::NetworkBroker
NetworkBroker(bool rootBroker=false) noexcept
Definition: NetworkBroker_impl.hpp:47
helics::makePortAddress
std::string makePortAddress(const std::string &networkInterface, int portNumber)
Definition: NetworkBrokerData.cpp:216
helics::CoreBroker
Definition: CoreBroker.hpp:94