GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
udp_server.hpp
1#pragma once
2
3#include <asio.hpp>
4#include <array>
5#include <cstdint>
6#include <deque>
7#include <map>
8#include <string>
9#include <vector>
10
11#include "io/base.hpp"
12
13namespace roboctrl::io {
14
17public:
18 struct info_type {
19 using key_type = std::string;
20 using owner_type = udp_server;
21 std::string key_;
22 std::string address{"0.0.0.0"};
23 std::uint16_t port{11451};
24 const std::string& key() const { return key_; }
25 };
26 using endpoint = asio::ip::udp::endpoint;
27
28 explicit udp_server(const info_type& info);
29 void connect();
30 void start();
31 void stop();
32 endpoint local_endpoint() const { return socket_.local_endpoint(); }
33
34 template<typename Fn>
35 void on_data(const endpoint& peer, Fn fn) {
36 callbacks_[peer].add([fn = std::move(fn)](data_ptr data) mutable -> auto {
37 return fn(byte_span{data->data(), data->size()});
38 });
39 }
40
41 awaitable<void> send(const endpoint& peer, byte_span data);
42 awaitable<void> task();
43 std::string desc() const { return std::format("udp server {}", info_.key_); }
44
45private:
46 awaitable<void> send_task();
47 struct datagram {
48 endpoint peer;
49 std::vector<std::byte> data;
50 };
51 info_type info_;
52 asio::ip::udp::socket socket_;
53 std::array<std::byte, 65536> buffer_{};
54 std::map<endpoint, callback<data_ptr>> callbacks_;
55 std::deque<datagram> queue_;
56 std::size_t queued_bytes_{};
57 bool connected_{};
58 bool started_{};
59 bool sending_{};
60};
61} // namespace roboctrl::io
IO的基础组件。
std::shared_ptr< const std::vector< std::byte > > data_ptr
只读共享数据缓冲。
Definition base.hpp:40
std::span< const std::byte > byte_span
只读 byte span。
Definition base.hpp:45