helics  3.0.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/CoreTypes.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, InterfaceTypes baseline, int tcode>
49 {
50  netInfo.server_mode = NetworkBrokerData::ServerModeOptions::SERVER_DEFAULT_ACTIVE;
51 }
52 
53 template<class COMMS, InterfaceTypes 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::ServerModeOptions::SERVER_DEFAULT_ACTIVE;
58 }
59 
60 template<class COMMS, InterfaceTypes 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, InterfaceTypes 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  netInfo.observer = BrokerBase::observer;
78  CommsBroker<COMMS, CoreBroker>::comms->setName(CoreBroker::getIdentifier());
79  CommsBroker<COMMS, CoreBroker>::comms->loadNetworkInfo(netInfo);
80  CommsBroker<COMMS, CoreBroker>::comms->setTimeout(BrokerBase::networkTimeout.to_ms());
81 
82  auto res = CommsBroker<COMMS, CoreBroker>::comms->connect();
83  if (res) {
84  if (netInfo.portNumber < 0) {
85  netInfo.portNumber = CommsBroker<COMMS, CoreBroker>::comms->getPort();
86  }
87  }
88  return res;
89 }
90 
91 template<class COMMS, InterfaceTypes baseline, int tcode>
93 {
94  std::string add;
95  if (CommsBroker<COMMS, CoreBroker>::comms->isConnected()) {
96  add = CommsBroker<COMMS, CoreBroker>::comms->getAddress();
97  } else {
98  std::lock_guard<std::mutex> lock(dataMutex);
99  switch (baseline) {
100  case InterfaceTypes::TCP:
101  case InterfaceTypes::IP:
102  case InterfaceTypes::UDP:
103  if (!netInfo.localInterface.empty() && (netInfo.localInterface.back() == '*')) {
104  add = makePortAddress(
105  netInfo.localInterface.substr(0, netInfo.localInterface.size() - 1),
106  netInfo.portNumber);
107  } else {
108  add = makePortAddress(netInfo.localInterface, netInfo.portNumber);
109  }
110  break;
111  case InterfaceTypes::INPROC:
112  case InterfaceTypes::IPC:
113  default:
114  if (!netInfo.localInterface.empty()) {
115  add = netInfo.localInterface;
116  } else {
117  add = CoreBroker::getIdentifier();
118  }
119  break;
120  }
121  }
122  return add;
123 }
124 
125 } // 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:217
helics::CoreBroker
Definition: CoreBroker.hpp:95