timemory 3.3.0
Modular C++ Toolkit for Performance Analysis and Logging. Profiling API and Tools for C, C++, CUDA, Fortran, and Python. The C++ template API is essentially a framework to creating tools: it is designed to provide a unifying interface for recording various performance measurements alongside data logging and interfaces to other tools.
tim::socket::manager Class Reference

#include "timemory/utility/socket.hpp"

+ Collaboration diagram for tim::socket::manager:

Public Types

using socket_map_t = std::unordered_map< std::string, socket_t >
 
using listen_info_t = std::pair< int64_t, int64_t >
 

Public Member Functions

 manager ()=default
 
 ~manager ()=default
 
 manager (const manager &)=default
 
 manager (manager &&)=default
 
manageroperator= (const manager &)=default
 
manageroperator= (manager &&)=default
 
template<typename CallbackT >
auto listen (const std::string &_channel_name, int _port, CallbackT &&callback, int64_t _max_packets=0) -> decltype(callback(_channel_name), listen_info_t{})
 listen for data on a socket. Returns a pair of the number of packets received and the number of bytes received. If both are -1, connecting to socket failed. More...
 
bool send (const std::string &_channel_name, const std::string &_data)
 
bool connect (const std::string &_channel_name, const std::string &_ip, int _port)
 
bool close (const std::string &_channel_name)
 

Static Public Attributes

static constexpr int buffer_size = 4096
 

Detailed Description

Definition at line 61 of file socket.hpp.

Member Typedef Documentation

◆ listen_info_t

using tim::socket::manager::listen_info_t = std::pair<int64_t, int64_t>

Definition at line 66 of file socket.hpp.

◆ socket_map_t

using tim::socket::manager::socket_map_t = std::unordered_map<std::string, socket_t>

Definition at line 65 of file socket.hpp.

Constructor & Destructor Documentation

◆ manager() [1/3]

tim::socket::manager::manager ( )
default

◆ ~manager()

tim::socket::manager::~manager ( )
default

◆ manager() [2/3]

tim::socket::manager::manager ( const manager )
default

◆ manager() [3/3]

tim::socket::manager::manager ( manager &&  )
default

Member Function Documentation

◆ close()

bool tim::socket::manager::close ( const std::string &  _channel_name)
inline

Definition at line 222 of file socket.hpp.

223 {
224 if(m_client_sockets.find(_channel_name) != m_client_sockets.end())
225 {
226 socket_t s = m_client_sockets.at(_channel_name);
228 tim::socket::manager::quit();
229 return true;
230 }
231 return false;
232 }
bool close(const std::string &_channel_name)
Definition: socket.hpp:222
int socket_t
Definition: socket.hpp:56

References close().

Referenced by close(), and connect().

◆ connect()

bool tim::socket::manager::connect ( const std::string &  _channel_name,
const std::string &  _ip,
int  _port 
)
inline

Definition at line 189 of file socket.hpp.

190 {
191 if(tim::socket::manager::init() != 0)
192 {
193 std::cerr << "Can't start socket!" << std::endl;
194 return false;
195 }
196
197 socket_t _sock = ::socket(AF_INET, SOCK_STREAM, 0);
198 if(_sock == invalid_socket)
199 {
200 std::cerr << "Can't create socket!" << std::endl;
201 tim::socket::manager::quit();
202 return false;
203 }
204
205 sockaddr_in _hint;
206 _hint.sin_family = AF_INET;
207 _hint.sin_port = htons(_port);
208 inet_pton(AF_INET, _ip.c_str(), &_hint.sin_addr);
209
210 int _conn_result = ::connect(_sock, (sockaddr*) &_hint, sizeof(_hint));
211 if(_conn_result == socket_error)
212 {
213 std::cerr << "Can't connect to server!" << std::endl;
215 tim::socket::manager::quit();
216 return false;
217 }
218 m_client_sockets[_channel_name] = _sock;
219 return true;
220 }
bool connect(const std::string &_channel_name, const std::string &_ip, int _port)
Definition: socket.hpp:189

References close(), and connect().

Referenced by connect().

◆ listen()

template<typename CallbackT >
auto tim::socket::manager::listen ( const std::string &  _channel_name,
int  _port,
CallbackT &&  callback,
int64_t  _max_packets = 0 
) -> decltype(callback(_channel_name), listen_info_t{})
inline

listen for data on a socket. Returns a pair of the number of packets received and the number of bytes received. If both are -1, connecting to socket failed.

Definition at line 81 of file socket.hpp.

83 {})
84 {
85 if(tim::socket::manager::init() != 0)
86 {
87 std::cerr << "Can't start socket!" << std::endl;
88 return { -1, -1 };
89 }
90
91 socket_t _listening = ::socket(AF_INET, SOCK_STREAM, 0);
92 if(_listening == invalid_socket)
93 {
94 std::cerr << "Can't create a socket!" << std::endl;
95 return { -1, -1 };
96 }
97
98 sockaddr_in _hint;
99 _hint.sin_family = AF_INET;
100 _hint.sin_port = htons(_port);
101#if defined(TIMEMORY_WINDOWS)
102 _hint.sin_addr.S_un.S_addr = INADDR_ANY;
103#else
104 _hint.sin_addr.s_addr = INADDR_ANY;
105#endif
106
107 ::bind(_listening, (sockaddr*) &_hint, sizeof(_hint));
108 ::listen(_listening, SOMAXCONN);
109
110 sockaddr_in _client;
111#if defined(TIMEMORY_WINDOWS)
112 int _client_size = sizeof(_client);
113#else
114 unsigned int _client_size = sizeof(_client);
115#endif
116 socket_t _client_socket = accept(_listening, (sockaddr*) &_client, &_client_size);
117 m_server_sockets[_channel_name] = _client_socket;
118 char _host[NI_MAXHOST];
119 char _service[NI_MAXSERV];
120
121 memset(_host, 0, NI_MAXHOST);
122 memset(_service, 0, NI_MAXSERV);
123 if(getnameinfo((sockaddr*) &_client, sizeof(_client), _host, NI_MAXHOST, _service,
124 NI_MAXSERV, 0) == 0)
125 {
126 std::cout << _host << " connected on port " << _service << std::endl;
127 }
128 else
129 {
130 inet_ntop(AF_INET, &_client.sin_addr, _host, NI_MAXHOST);
131 std::cout << _host << " connected on port " << ntohs(_client.sin_port)
132 << std::endl;
133 }
134 tim::socket::manager::close(_listening);
135 char _buff[buffer_size];
136 listen_info_t _nrecv = { 0, 0 };
137 while(true)
138 {
139 memset(_buff, 0, buffer_size);
140
141 int _bytes_recv = ::recv(_client_socket, _buff, buffer_size, 0);
142
143 // exit out of receiving
144 if(_bytes_recv == socket_error)
145 {
146 std::cerr << "Error in recv(). Quitting" << std::endl;
147 break;
148 }
149
150 if(_bytes_recv > 0)
151 {
152 _nrecv.first += 1;
153 _nrecv.second += _bytes_recv;
154 callback(std::string(_buff, 0, _bytes_recv));
155 if(_max_packets > 0 && _nrecv.first >= _max_packets)
156 {
157 std::cerr << "Maximum number of packages received: " << _max_packets
158 << ". Quitting" << std::endl;
159 break;
160 }
161 }
162 else
163 {
164 break;
165 }
166 }
167
168 tim::socket::manager::close(_client_socket);
169 tim::socket::manager::quit();
170 return _nrecv;
171 }
auto listen(const std::string &_channel_name, int _port, CallbackT &&callback, int64_t _max_packets=0) -> decltype(callback(_channel_name), listen_info_t{})
listen for data on a socket. Returns a pair of the number of packets received and the number of bytes...
Definition: socket.hpp:81
std::pair< int64_t, int64_t > listen_info_t
Definition: socket.hpp:66
static constexpr int buffer_size
Definition: socket.hpp:64
tim::mpl::apply< std::string > string
Definition: macros.hpp:53

◆ operator=() [1/2]

manager & tim::socket::manager::operator= ( const manager )
default

◆ operator=() [2/2]

manager & tim::socket::manager::operator= ( manager &&  )
default

◆ send()

bool tim::socket::manager::send ( const std::string &  _channel_name,
const std::string &  _data 
)
inline

Definition at line 173 of file socket.hpp.

174 {
175 if(m_client_sockets.find(_channel_name) != m_client_sockets.end())
176 {
177 socket_t _sock = m_client_sockets.at(_channel_name);
178 int _send_result = ::send(_sock, _data.c_str(), _data.size() + 1, 0);
179 if(_send_result == socket_error)
180 {
181 std::cerr << "Can't create socket!" << std::endl;
182 return false;
183 }
184 return true;
185 }
186 return false;
187 }
bool send(const std::string &_channel_name, const std::string &_data)
Definition: socket.hpp:173

References send().

Referenced by send().

Member Data Documentation

◆ buffer_size

constexpr int tim::socket::manager::buffer_size = 4096
staticconstexpr

Definition at line 64 of file socket.hpp.


The documentation for this class was generated from the following file: