diff --git a/include/parselink/proto/message.h b/include/parselink/proto/message.h index 5bc081c..66dbd4d 100644 --- a/include/parselink/proto/message.h +++ b/include/parselink/proto/message.h @@ -18,10 +18,13 @@ #ifndef message_0c61530748b9f966 #define message_0c61530748b9f966 +#include "parselink/utility/ctstring.h" + #include #include #include + namespace parselink { namespace proto { @@ -36,10 +39,15 @@ namespace proto { struct base_message {}; +template +struct message : base_message { + static constexpr auto name() noexcept { return Str; } +}; + template concept message_type = std::is_base_of_v; -struct error_message : base_message { +struct error_message : message<"error"> { std::uint32_t code; // An error code std::string_view what; // A string }; diff --git a/source/client/client.cpp b/source/client/client.cpp index 2e29472..a94035b 100644 --- a/source/client/client.cpp +++ b/source/client/client.cpp @@ -21,11 +21,13 @@ #include "parselink/logging.h" #include "parselink/utility/ctstring.h" +#include "parselink/msgpack/core/packer.h" + #include #include #include #include -#include +#include #include #include @@ -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 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 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 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);