preCICE v3.2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
SocketCommunication.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <boost/asio.hpp>
4#include <map>
5#include <memory>
6#include <set>
7#include <stddef.h>
8#include <string>
9#include <thread>
10
11#include "com/Communication.hpp"
12#include "com/SharedPointer.hpp"
14#include "logging/Logger.hpp"
16#include "utils/networking.hpp"
17
18namespace precice::com {
21public:
22 SocketCommunication(unsigned short portNumber = 0,
23 bool reuseAddress = false,
25 std::string addressDirectory = ".");
26
27 explicit SocketCommunication(std::string const &addressDirectory);
28
29 ~SocketCommunication() override;
30
31 size_t getRemoteCommunicatorSize() override;
32
33 void acceptConnection(std::string const &acceptorName,
34 std::string const &requesterName,
35 std::string const &tag,
36 int acceptorRank,
37 int rankOffset = 0) override;
38
39 void acceptConnectionAsServer(std::string const &acceptorName,
40 std::string const &requesterName,
41 std::string const &tag,
42 int acceptorRank,
43 int requesterCommunicatorSize) override;
44
45 void requestConnection(std::string const &acceptorName,
46 std::string const &requesterName,
47 std::string const &tag,
48 int requesterRank,
49 int requesterCommunicatorSize) override;
50
51 void requestConnectionAsClient(std::string const &acceptorName,
52 std::string const &requesterName,
53 std::string const &tag,
54 std::set<int> const &acceptorRanks,
55 int requesterRank) override;
56
57 void closeConnection() override;
58
60 void send(std::string const &itemToSend, Rank rankReceiver) override;
61
63 void send(precice::span<const int> itemsToSend, Rank rankReceiver) override;
64
66 PtrRequest aSend(precice::span<const int> itemsToSend, Rank rankReceiver) override;
67
69 void send(precice::span<const double> itemsToSend, Rank rankReceiver) override;
70
72 PtrRequest aSend(precice::span<const double> itemsToSend, Rank rankReceiver) override;
73
75 void send(double itemToSend, Rank rankReceiver) override;
76
78 PtrRequest aSend(const double &itemToSend, Rank rankReceiver) override;
79
81 void send(int itemToSend, Rank rankReceiver) override;
82
84 PtrRequest aSend(const int &itemToSend, Rank rankReceiver) override;
85
87 void send(bool itemToSend, Rank rankReceiver) override;
88
90 PtrRequest aSend(const bool &itemToSend, Rank rankReceiver) override;
91
93 void receive(std::string &itemToReceive, Rank rankSender) override;
94
96 void receive(precice::span<int> itemsToReceive, Rank rankSender) override;
97
99 void receive(precice::span<double> itemsToReceive, Rank rankSender) override;
100
103 int rankSender) override;
104
106 void receive(double &itemToReceive, Rank rankSender) override;
107
109 PtrRequest aReceive(double &itemToReceive, Rank rankSender) override;
110
112 void receive(int &itemToReceive, Rank rankSender) override;
113
115 PtrRequest aReceive(int &itemToReceive, Rank rankSender) override;
116
118 void receive(bool &itemToReceive, Rank rankSender) override;
119
121 PtrRequest aReceive(bool &itemToReceive, Rank rankSender) override;
122
123 void prepareEstablishment(std::string const &acceptorName,
124 std::string const &requesterName) override;
125
126 void cleanupEstablishment(std::string const &acceptorName,
127 std::string const &requesterName) override;
128
129private:
130 logging::Logger _log{"com::SocketCommunication"};
131
133 unsigned short _portNumber;
134
136
139
142
143 using IOContext = boost::asio::io_context;
144 using Socket = boost::asio::ip::tcp::socket;
145 using WorkGuard = boost::asio::executor_work_guard<IOContext::executor_type>;
146
150
153
155
156 bool isClient();
157 bool isServer();
158
160};
161} // namespace precice::com
Interface for all interprocess communication classes.
Implements Communication by using sockets.
std::unique_ptr< WorkGuard > _workGuard
PtrRequest aReceive(precice::span< double > itemsToReceive, int rankSender) override
Asynchronously receives an array of double values.
void cleanupEstablishment(std::string const &acceptorName, std::string const &requesterName) override
Clean-up environment used to establish the communication.
void send(std::string const &itemToSend, Rank rankReceiver) override
Sends a std::string to process with given rank.
std::string _addressDirectory
Directory where IP address is exchanged by file.
void acceptConnectionAsServer(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int requesterCommunicatorSize) override
Accepts connection from another communicator, which has to call requestConnectionAsClient().
std::shared_ptr< IOContext > _ioContext
void requestConnectionAsClient(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, std::set< int > const &acceptorRanks, int requesterRank) override
Connects to another communicator, which has to call acceptConnectionAsServer().
std::string _networkName
Name of network to communicate over.
size_t getRemoteCommunicatorSize() override
Returns the number of processes in the remote communicator.
std::map< int, std::shared_ptr< Socket > > _sockets
Remote rank -> socket map.
boost::asio::ip::tcp::socket Socket
void receive(std::string &itemToReceive, Rank rankSender) override
Receives a std::string from process with given rank.
boost::asio::executor_work_guard< IOContext::executor_type > WorkGuard
void closeConnection() override
Disconnects from communication space, i.e. participant.
void prepareEstablishment(std::string const &acceptorName, std::string const &requesterName) override
Prepare environment used to establish the communication.
unsigned short _portNumber
Port used for socket connection.
SocketCommunication(unsigned short portNumber=0, bool reuseAddress=false, std::string networkName=utils::networking::loopbackInterfaceName(), std::string addressDirectory=".")
PtrRequest aSend(precice::span< const int > itemsToSend, Rank rankReceiver) override
Asynchronously sends an array of integer values.
void requestConnection(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int requesterRank, int requesterCommunicatorSize) override
Connects to another communicator, which has to call acceptConnection().
void acceptConnection(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int rankOffset=0) override
Accepts connection from another communicator, which has to call requestConnection().
This class provides a lightweight logger.
Definition Logger.hpp:17
A C++ 11 implementation of the non-owning C++20 std::span type.
Definition span.hpp:284
contains the data communication abstraction layer.
std::string loopbackInterfaceName()
Returns the name of the canonical loopback interface on this system.
Definition networking.cpp:5
int Rank
Definition Types.hpp:37