'Boost Asio Timeout Approach
I have situation where I need to collect data from more than 100 clients in 100 ms. After that time I need to process collected data. When process is done, need to restart step where I am collecting data from the clients and so on in the loop.
To collect the data I am using the current implementation :
#include <boost/asio.hpp>
#include <boost/bind/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <iostream>
#include <list>
#include <set>
namespace net = boost::asio;
using net::ip::udp;
using boost::system::error_code;
using namespace std::chrono_literals;
using namespace std::placeholders;
struct listener {
using Buffer = std::array<char, 100>; // receiver buffer
udp::socket s;
listener(net::any_io_executor ex, uint16_t port) : s{ex, {{}, port}} {}
void start() {
read_loop(error_code{}, -1); // prime the async pump
}
void stop() {
post(s.get_executor(), [this] { s.cancel(); });
}
void report() const {
std::cout << s.local_endpoint() << ": A total of " << received_packets
<< " were received from " << unique_senders.size()
<< " unique senders\n";
}
private:
Buffer receive_buffer;
udp::endpoint sender;
std::set<udp::endpoint> unique_senders;
size_t received_packets = 0;
void read_loop(error_code ec, size_t bytes) {
if (bytes != size_t(-1)) {
// std::cout << "read_loop (" << ec.message() << ")\n";
if (ec)
return;
received_packets += 1;
unique_senders.insert(sender);
std::cout << "Received:" << bytes << " sender:" << sender << " recorded:"
<< received_packets << "\n";
//std::cout <<
// std::string_view(receive_buffer.data(), bytes) << "\n";
}
s.async_receive_from(net::buffer(receive_buffer), sender,
std::bind_front(&listener::read_loop, this));
};
};
int main() {
net::thread_pool io(1); // single threaded
using Timer = net::steady_timer;
using TimePoint = std::chrono::steady_clock::time_point;
using Clock = std::chrono::steady_clock;
Timer timer_(io);
std::list<listener> listeners;
auto each = [&](auto mf) { for (auto& l : listeners) (l.*mf)(); };
for (uint16_t port : {1234, 1235, 1236})
listeners.emplace_back(io.get_executor(), port);
each(&listener::start);
TimePoint startTP = Clock::now();
timer_.expires_at(startTP + 100ms); // collect data for 100 ms
timer_.async_wait([&](auto &&){each(&listener::stop);});
std::cout << "Done ! \n";
each(&listener::report);
io.join();
}
Is it okay approach to stop collecting process ?
TimePoint startTP = Clock::now();
timer_.expires_at(startTP + 100ms); // collect data for 100 ms
timer_.async_wait([&](auto &&){each(&listener::stop);});
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|

