helics  2.8.1
NetworkCore_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/helicsCLI11.hpp"
10 #include "NetworkCore.hpp"
11 
12 #include <memory>
13 #include <string>
14 
15 namespace helics {
16 constexpr const char* defBrokerInterface[] = {"127.0.0.1",
17  "127.0.0.1",
18  "tcp://127.0.0.1",
19  "_ipc_broker",
20  ""};
21 constexpr const char* defLocalInterface[] = {"127.0.0.1", "127.0.0.1", "tcp://127.0.0.1", "", ""};
22 
23 template<class COMMS, interface_type baseline>
25 {
26  netInfo.server_mode = NetworkBrokerData::server_mode_options::server_default_deactivated;
27 }
28 
29 template<class COMMS, interface_type baseline>
30 NetworkCore<COMMS, baseline>::NetworkCore(const std::string& coreName):
31  CommsBroker<COMMS, CommonCore>(coreName)
32 {
33  netInfo.server_mode = NetworkBrokerData::server_mode_options::server_default_deactivated;
34 }
35 
36 template<class COMMS, interface_type baseline>
37 std::shared_ptr<helicsCLI11App> NetworkCore<COMMS, baseline>::generateCLI()
38 {
39  auto app = CommonCore::generateCLI();
40  CLI::App_p netApp =
41  netInfo.commandLineParser(defLocalInterface[static_cast<int>(baseline)], false);
42  app->add_subcommand(netApp);
43  return app;
44 }
45 
46 template<class COMMS, interface_type baseline>
48 {
49  std::lock_guard<std::mutex> lock(dataMutex);
50  if (netInfo.brokerAddress.empty()) // cores require a broker
51  {
52  netInfo.brokerAddress = defBrokerInterface[static_cast<int>(baseline)];
53  }
54  CommsBroker<COMMS, CommonCore>::comms->setRequireBrokerConnection(true);
55  netInfo.useJsonSerialization = BrokerBase::useJsonSerialization;
56  CommsBroker<COMMS, CommonCore>::comms->setName(CommonCore::getIdentifier());
57  CommsBroker<COMMS, CommonCore>::comms->loadNetworkInfo(netInfo);
58  CommsBroker<COMMS, CommonCore>::comms->setTimeout(BrokerBase::networkTimeout.to_ms());
59  // comms->setMessageSize(maxMessageSize, maxMessageCount);
60  auto res = CommsBroker<COMMS, CommonCore>::comms->connect();
61  if (res) {
62  if (netInfo.portNumber < 0) {
63  netInfo.portNumber = CommsBroker<COMMS, CommonCore>::comms->getPort();
64  }
65  }
66  return res;
67 }
68 
69 template<class COMMS, interface_type baseline>
71 {
72  std::string add;
73  if (CommsBroker<COMMS, CommonCore>::comms->isConnected()) {
74  add = CommsBroker<COMMS, CommonCore>::comms->getAddress();
75  } else {
76  std::lock_guard<std::mutex> lock(dataMutex);
77  switch (baseline) {
78  case interface_type::tcp:
79  case interface_type::ip:
80  case interface_type::udp:
81  if (!netInfo.localInterface.empty() && (netInfo.localInterface.back() == '*')) {
82  add = makePortAddress(
83  netInfo.localInterface.substr(0, netInfo.localInterface.size() - 1),
84  netInfo.portNumber);
85  } else {
86  add = makePortAddress(netInfo.localInterface, netInfo.portNumber);
87  }
88  break;
89  case interface_type::inproc:
90  case interface_type::ipc:
91  default:
92  if (!netInfo.localInterface.empty()) {
93  add = netInfo.localInterface;
94  } else {
95  add = CommonCore::getIdentifier();
96  }
97  break;
98  }
99  }
100  return add;
101 }
102 
103 } // namespace helics
helics::CommonCore
Definition: CommonCore.hpp:73
helics::CommsBroker
Definition: CommsBroker.hpp:21
helics::NetworkCore::NetworkCore
NetworkCore() noexcept
Definition: NetworkCore_impl.hpp:24
helics
the main namespace for the helics co-simulation library User functions will be in the helics namespac...
Definition: AsyncFedCallInfo.hpp:14
helics::NetworkCore
Definition: NetworkCore.hpp:18
helics::makePortAddress
std::string makePortAddress(const std::string &networkInterface, int portNumber)
Definition: NetworkBrokerData.cpp:216