GKD.RoboCtrl
RoboMaster Linux 电控:异步 IO、设备驱动与机器人控制
载入中...
搜索中...
未找到
tcp.h
浏览该文件的文档.
1
6#pragma once
7
8#include <asio.hpp>
9#include <array>
10#include <cstdint>
11#include <format>
12#include <memory>
13#include <string>
14#include <string_view>
15#include <utility>
16#include <vector>
17
18#include "core/async.hpp"
19#include "io/base.hpp"
20#include "utils/callback.hpp"
21#include "io/write_queue.hpp"
22
23namespace roboctrl::io{
24
28class tcp : public bare_io_base, public std::enable_shared_from_this<tcp>{
29public:
33 struct info_type{
34 using key_type = std::string;
35 using owner_type = tcp;
36
37 std::string name;
38 std::string address;
39 std::uint16_t port;
40
41 const std::string& key()const{
42 return name;
43 }
44 };
45
49 explicit tcp(info_type info);
53 tcp(asio::ip::tcp::socket socket, std::string key);
54
56 void start();
57
62
67
69 void on_close(std::function<void()> callback) { on_close_ = std::move(callback); }
70
72 inline std::string desc()const{
73 return std::format("tcp socket (<{}> to {}:{})",info_.name,info_.address,info_.port);
74 }
75
76private:
77 static awaitable<void> run_with_lifetime(std::shared_ptr<tcp> self);
78
79 asio::ip::tcp::socket socket_;
80 write_queue write_queue_;
81 info_type info_;
82 std::array<std::byte,1024> buffer_;
83 bool started_ {false};
84 std::function<void()> on_close_;
85 bool closed_notified_ {false};
86
87 void notify_closed();
88};
89
90static_assert(bare_io<tcp>);
91
97public:
101 struct info_type{
102 using key_type = std::string;
103 using owner_type = tcp_server;
104
105 std::string name;
106 std::string address;
107 std::uint16_t port;
108
109 const std::string& key()const{
110 return name;
111 }
112 };
113
117 explicit tcp_server(info_type info);
118
120 void start();
121
126
130 void on_connect(std::function<awaitable<void>(std::shared_ptr<tcp>)> callback){
131 on_connect_.add(std::move(callback));
132 }
133
137 void on_connect(std::function<void(std::shared_ptr<tcp>)> callback){
138 on_connect_.add(std::move(callback));
139 }
140
142 inline std::string desc()const{
143 return std::format("tcp server (<{}> listening on {}:{})",info_.name,info_.address,info_.port);
144 }
145
146private:
147 std::shared_ptr<tcp> make_connection(asio::ip::tcp::socket socket);
148
149 asio::ip::tcp::acceptor acceptor_;
150 info_type info_;
152 std::vector<std::shared_ptr<tcp>> connections_;
153 bool started_ {false};
154
155 void remove_connection(const std::shared_ptr<tcp>& connection);
156};
157}
异步任务上下文组件。
协程回调收集器。
管理一组协程回调的容器。
Definition callback.hpp:36
TCP 监听服务器,负责接受并管理多连接。
Definition tcp.h:96
awaitable< void > task()
接受连接的长任务。
Definition tcp.cpp:120
void on_connect(std::function< void(std::shared_ptr< tcp >)> callback)
注册同步回调,在新连接建立时触发。
Definition tcp.h:137
std::string desc() const
返回服务器监听描述。
Definition tcp.h:142
void on_connect(std::function< awaitable< void >(std::shared_ptr< tcp >)> callback)
注册协程回调,在新连接建立时触发。
Definition tcp.h:130
void start()
启动服务器监听协程;重复调用不会重复启动。
Definition tcp.cpp:111
TCP 客户端套接字。
Definition tcp.h:28
awaitable< void > send(byte_span data)
发送字节数据。
Definition tcp.cpp:57
void on_close(std::function< void()> callback)
注册连接关闭回调,仅触发一次。
Definition tcp.h:69
void start()
启动客户端接收协程;重复调用不会重复启动。
Definition tcp.cpp:25
awaitable< void > task()
接收循环任务。
Definition tcp.cpp:66
std::string desc() const
返回客户端连接描述。
Definition tcp.h:72
将同一异步流上的写操作串行化。
IO的基础组件。
std::span< const std::byte > byte_span
只读 byte span。
Definition base.hpp:45
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:46
TCP 连接参数。
Definition tcp.h:33
std::string name
TCP 连接名称
Definition tcp.h:37
std::string address
TCP 连接地址
Definition tcp.h:38
std::uint16_t port
TCP 端口
Definition tcp.h:39
服务器初始化参数。
Definition tcp.h:101
std::string address
监听地址
Definition tcp.h:106
std::uint16_t port
监听端口
Definition tcp.h:107
std::string name
服务器名称
Definition tcp.h:105