This commit is contained in:
Kurt Sassenrath 2024-01-17 14:30:08 -08:00
parent 07698b70b4
commit a65bff1697
2 changed files with 26 additions and 9 deletions

View File

@ -18,10 +18,13 @@
#ifndef message_0c61530748b9f966
#define message_0c61530748b9f966
#include "parselink/utility/ctstring.h"
#include <cstdint>
#include <span>
#include <string_view>
namespace parselink {
namespace proto {
@ -36,10 +39,15 @@ namespace proto {
struct base_message {};
template <ct::string Str>
struct message : base_message {
static constexpr auto name() noexcept { return Str; }
};
template <typename T>
concept message_type = std::is_base_of_v<base_message, T>;
struct error_message : base_message {
struct error_message : message<"error"> {
std::uint32_t code; // An error code
std::string_view what; // A string
};

View File

@ -21,11 +21,13 @@
#include "parselink/logging.h"
#include "parselink/utility/ctstring.h"
#include "parselink/msgpack/core/packer.h"
#include <boost/asio/as_tuple.hpp>
#include <boost/asio/co_spawn.hpp>
#include <boost/asio/detached.hpp>
#include <boost/asio/ip/address.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ip/udp.hpp>
#include <boost/asio/signal_set.hpp>
#include <boost/beast.hpp>
@ -37,6 +39,7 @@ using net::awaitable;
using net::co_spawn;
using net::detached;
using net::use_awaitable;
using udp = net::ip::udp;
namespace {
@ -78,7 +81,7 @@ simple_client::simple_client(config const& cfg) noexcept
awaitable<void> simple_client::connect_to_server() noexcept {
logger.debug("Connecting to parselink server...");
net::ip::tcp::resolver resolver(io_context_);
udp::resolver resolver(io_context_);
auto [ec, results] = co_await resolver.async_resolve(
{server_address_, std::to_string(server_port_)}, no_ex_coro);
@ -92,12 +95,18 @@ awaitable<void> simple_client::connect_to_server() noexcept {
co_return;
}
net::ip::tcp::socket socket(io_context_);
for (auto const& r : results) {
udp::socket socket(io_context_);
socket.open(r.endpoint().protocol());
logger.debug("Connecting to {}", r.endpoint());
auto [ec] = co_await socket.async_connect(r, no_ex_coro);
if (!ec) {
std::array<std::byte, 4096> buff;
msgpack::packer packer(buff);
packer.pack("hello");
auto span = packer.subspan();
auto [ec, bw] = co_await socket.async_send_to(
net::buffer(span.data(), span.size()), r.endpoint(),
no_ex_coro);
if (ec) {
logger.error("connection to {} failed: {}",
results.begin()->endpoint(), ec);
continue;
@ -118,8 +127,8 @@ std::error_code simple_client::run() noexcept {
logger.debug("Starting client.");
net::signal_set signals(io_context_, SIGINT, SIGTERM);
signals.async_wait([&](auto sig, auto) {
logger.info("Received signal: {}. Shutting down.", sig);
signals.async_wait([&](auto sig, auto g) {
logger.info("Received signal: {} {}. Shutting down.", sig, g);
});
co_spawn(io_context_, connect_to_websocket(), detached);