GKD.RoboCtrl
载入中...
搜索中...
未找到
tcp.cpp
1#include "io/tcp.h"
2#include "core/async.hpp"
3#include "io/base.hpp"
4
5#include <format>
6#include <utility>
7
8using namespace roboctrl::io;
9
11 : bare_io_base{},
12 socket_{roboctrl::executor()},
13 info_{std::move(info)}
14{
15 auto endpoint = asio::ip::tcp::endpoint(
16 asio::ip::make_address(info.address),
17 info.port
18 );
19 socket_.connect(endpoint);
20
22}
23
24tcp::tcp(asio::ip::tcp::socket socket, std::string key)
25 : bare_io_base{},
26 socket_{std::move(socket)},
27 info_{.name = std::move(key), .address = std::string{}, .port = 0}
28{
29 auto remote = socket_.remote_endpoint();
30 info_.address = remote.address().to_string();
31 info_.port = remote.port();
32}
33
35{
36 co_await asio::async_write(socket_, asio::buffer(data), asio::use_awaitable);
37}
38
40{
41 while(true){
42 auto bytes = co_await socket_.async_read_some(asio::buffer(buffer_), asio::use_awaitable);
43 dispatch(buffer_);
44 }
45}
46
48 : acceptor_{roboctrl::get<task_context>().get_executor()},
49 info_{std::move(info)}
50{
51 auto endpoint = asio::ip::tcp::endpoint(
52 asio::ip::make_address(info_.address),
53 info_.port
54 );
55
56 acceptor_.open(endpoint.protocol());
57 acceptor_.set_option(asio::ip::tcp::acceptor::reuse_address(true));
58 acceptor_.bind(endpoint);
59 acceptor_.listen();
60}
61
63{
64 while(true){
65 asio::ip::tcp::socket socket{acceptor_.get_executor()};
66 co_await acceptor_.async_accept(socket, asio::use_awaitable);
67 auto connection = make_connection(std::move(socket));
68 connections_.push_back(connection);
70 on_connect_(connection);
71 }
72}
73
74std::shared_ptr<tcp> tcp_server::make_connection(asio::ip::tcp::socket socket)
75{
76 auto remote = socket.remote_endpoint();
77 auto key = std::format("{}:{}:{}:{}", info_.name, remote.address().to_string(), remote.port(), connections_.size());
78 return std::make_shared<tcp>(std::move(socket), std::move(key));
79}
异步任务上下文组件。
异步任务上下文类。
Definition async.hpp:52
裸IO组件。
Definition base.hpp:65
void dispatch(byte_span bytes)
分发收到的字节流。
Definition base.hpp:103
tcp_server(info_type info)
构造监听器并立即开始监听。
Definition tcp.cpp:47
awaitable< void > task()
接受连接的长任务。
Definition tcp.cpp:62
tcp(info_type info)
通过连接信息构造客户端。
Definition tcp.cpp:10
awaitable< void > send(byte_span data)
发送字节数据。
Definition tcp.cpp:34
awaitable< void > task()
接收循环任务。
Definition tcp.cpp:39
IO的基础组件。
std::span< std::byte > byte_span
byte span,实际上就是一个std::span<std::byte>;
Definition base.hpp:42
auto spawn(task_context::task_type &&task)
添加一个协程任务到全局任务上下文中执行。
Definition async.hpp:151
asio::awaitable< T > awaitable
协程任务类型。
Definition async.hpp:42
auto executor()
获取全局任务上下文的executor。
Definition async.hpp:211
auto get() -> T &
获取单例实例
Definition multiton.hpp:183
TCP 连接参数。
Definition tcp.h:32
std::string address
TCP 连接地址
Definition tcp.h:37
std::uint16_t port
TCP 端口
Definition tcp.h:38
服务器初始化参数。
Definition tcp.h:85
std::string address
监听地址
Definition tcp.h:90
std::uint16_t port
监听端口
Definition tcp.h:91
std::string name
服务器名称
Definition tcp.h:89
TCP 客户端与服务器封装。