NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
tcp_socket.hpp
浏览该文件的文档.
1#ifndef NEFORCE_NETWORK_TCP_TCP_SOCKET_HPP__
2#define NEFORCE_NETWORK_TCP_TCP_SOCKET_HPP__
3
10
18NEFORCE_BEGIN_NAMESPACE__
19
25
69class NEFORCE_API tcp_socket : public ip_socket, public async_stream {
70public:
74 tcp_socket() = default;
75
79 tcp_socket(tcp_socket&&) = default;
80
85
91 ip_socket(fd) {}
92
96 ~tcp_socket() override = default;
97
105 void open(family f = family::INET4);
106
119 bool connect(const ip_address& endpoint, milliseconds timeout, bool was_blocking = true);
120
132 virtual ssize_t send(memory_view<const char> data, int flags = 0);
133
145
155
167 virtual ssize_t receive(memory_view<char> buffer, int flags = 0);
168
178 vector<char> receive_all(size_t expected_size);
179
184 NEFORCE_NODISCARD virtual bool is_ssl() const noexcept { return false; }
185
195 void async_connect(io_context& ctx, const ip_address& endpoint, function<void(error_code)> handler);
196
204 void async_connect(io_context& ctx, const ip_address& endpoint, cancellation_slot& slot,
205 function<void(error_code)> handler);
206
213 void async_read(io_context& ctx, memory_view<char> buffer, function<void(error_code, size_t)> handler) override;
214
223 function<void(error_code, size_t)> handler) override;
224
232 function<void(error_code, size_t)> handler) override;
233
242 function<void(error_code, size_t)> handler) override;
243
250 void async_receive(io_context& ctx, memory_view<char> buffer, function<void(error_code, size_t)> handler) {
251 async_read(ctx, buffer, move(handler));
252 }
253
262 function<void(error_code, size_t)> handler) {
263 async_read(ctx, buffer, slot, move(handler));
264 }
265
272 void async_send(io_context& ctx, memory_view<const char> buffer, function<void(error_code, size_t)> handler) {
273 async_write(ctx, buffer, move(handler));
274 }
275
284 function<void(error_code, size_t)> handler) {
285 async_write(ctx, buffer, slot, move(handler));
286 }
287
295 template <typename Token, enable_if_t<!is_same_v<decay_t<Token>, function<void(error_code, size_t)>>, int> = 0>
296 decltype(auto) async_receive(io_context& ctx, memory_view<char> buffer, Token&& token) {
297 return async_stream::async_read(ctx, buffer, forward<Token>(token));
298 }
299
307 template <typename Token, enable_if_t<!is_same_v<decay_t<Token>, function<void(error_code, size_t)>>, int> = 0>
308 decltype(auto) async_send(io_context& ctx, memory_view<const char> buffer, Token&& token) {
309 return async_stream::async_write(ctx, buffer, forward<Token>(token));
310 }
311
321 template <typename Token, enable_if_t<!is_same_v<decay_t<Token>, function<void(error_code)>>, int> = 0>
322 void async_connect(io_context& ctx, const ip_address& endpoint, Token&& token) {
323 async_connect(ctx, endpoint, function<void(error_code)>(forward<Token>(token)));
324 }
325
332 auto async_connect(io_context& ctx, const ip_address& endpoint, use_future_t /*unused*/) {
334 async_connect(ctx, endpoint, function<void(error_code)>(result.get_handler()));
335 return result.get();
336 }
337
343 void async_connect(io_context& ctx, const ip_address& endpoint, detached_t /*unused*/) {
344 async_connect(ctx, endpoint, function<void(error_code)>([](error_code) {}));
345 }
346
347#ifdef NEFORCE_STANDARD_20
354 auto async_connect(io_context& ctx, const ip_address& endpoint, use_awaitable_t /*unused*/) {
356 async_connect(ctx, endpoint, function<void(error_code)>(result.get_handler()));
357 return result.get();
358 }
359#endif
360};
361
362
363NEFORCE_BEGIN_INNER__
364
365template <>
366struct future_handler<error_code, tcp_socket> {
367 shared_ptr<promise<tcp_socket>> promise_;
368
369 void operator()(error_code ec, tcp_socket sock) {
370 if (ec) {
371 promise_->set_exception(_NEFORCE make_exception_ptr(system_exception(ec)));
372 } else {
373 promise_->set_value(move(sock));
374 }
375 }
376};
377
378NEFORCE_END_INNER__
379
380template <>
381struct async_result<use_future_t, void(error_code, tcp_socket)> {
382 using handler_type = inner::future_handler<error_code, tcp_socket>;
383 using return_type = future<tcp_socket>;
384 handler_type handler_;
385 explicit async_result(use_future_t /*unused*/) { handler_.promise_ = make_shared<promise<tcp_socket>>(); }
386 handler_type get_handler() { return handler_; }
387 return_type get() { return handler_.promise_->get_future(); }
388};
389 // TCP
391
392NEFORCE_END_NAMESPACE__
393#endif // NEFORCE_NETWORK_TCP_TCP_SOCKET_HPP__
异步流抽象基类
异步操作取消槽
异步流抽象基类
virtual void async_read(io_context &ctx, memory_view< char > buffer, function< void(error_code, size_t)> handler)=0
异步读取数据
virtual void async_write(io_context &ctx, memory_view< const char > buffer, function< void(error_code, size_t)> handler)=0
异步写入数据
函数包装器主模板声明
统一异步操作核心
IP地址封装类
ip_socket()=default
默认构造函数
ip_address::family family
网络地址族类型
tcp_socket & operator=(tcp_socket &&)=default
移动赋值运算符
void async_connect(io_context &ctx, const ip_address &endpoint, function< void(error_code)> handler)
异步连接到远程端点
void open(family f=family::INET4)
打开TCP socket
tcp_socket()=default
默认构造函数
void async_connect(io_context &ctx, const ip_address &endpoint, Token &&token)
异步连接—任意可调用对象版本
virtual bool is_ssl() const noexcept
检查是否为SSL/TLS socket
void send_all(memory_view< const char > data)
发送所有数据
auto async_connect(io_context &ctx, const ip_address &endpoint, use_future_t)
异步连接—use_future
vector< char > receive_all(size_t expected_size)
接收指定大小的所有数据
void async_read(io_context &ctx, memory_view< char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler) override
异步读取(带取消槽)
virtual ssize_t send(memory_view< const char > data, int flags=0)
发送数据
void async_receive(io_context &ctx, memory_view< char > buffer, function< void(error_code, size_t)> handler)
异步接收(转发到 async_read)
virtual ssize_t receive(memory_view< char > buffer, int flags=0)
接收数据
void async_connect(io_context &ctx, const ip_address &endpoint, detached_t)
异步连接—detached(即发即忘)
decltype(auto) async_receive(io_context &ctx, memory_view< char > buffer, Token &&token)
异步接收—模板令牌版本(转发到 async_read)
~tcp_socket() override=default
析构函数
tcp_socket(tcp_socket &&)=default
移动构造函数
bool connect(const ip_address &endpoint, milliseconds timeout, bool was_blocking=true)
连接到远程服务器
void async_write(io_context &ctx, memory_view< const char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler) override
异步写入(带取消槽)
auto async_connect(io_context &ctx, const ip_address &endpoint, use_awaitable_t)
异步连接—use_awaitable
void async_read(io_context &ctx, memory_view< char > buffer, function< void(error_code, size_t)> handler) override
异步读取数据
void async_send(io_context &ctx, memory_view< const char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler)
异步发送(带取消槽,转发到 async_write)
tcp_socket(native_handle_type fd)
从原生句柄构造
ssize_t send(memory_view< const char > data, milliseconds timeout, int flags=0)
带超时的发送数据
void async_send(io_context &ctx, memory_view< const char > buffer, function< void(error_code, size_t)> handler)
异步发送(转发到 async_write)
void async_receive(io_context &ctx, memory_view< char > buffer, cancellation_slot &slot, function< void(error_code, size_t)> handler)
异步接收(带取消槽,转发到 async_read)
decltype(auto) async_send(io_context &ctx, memory_view< const char > buffer, Token &&token)
异步发送—模板令牌版本(转发到 async_write)
void async_connect(io_context &ctx, const ip_address &endpoint, cancellation_slot &slot, function< void(error_code)> handler)
异步连接(带取消槽)
void async_write(io_context &ctx, memory_view< const char > buffer, function< void(error_code, size_t)> handler) override
异步写入数据
动态大小数组容器
通用函数包装器
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
void async_read(async_stream &stream, io_context &ctx, vector< char > &buffer, function< void(error_code, size_t)> handler)
异步读取指定字节数
void async_write(async_stream &stream, io_context &ctx, const void *data, size_t size, function< void(error_code, size_t)> handler)
异步写入指定字节数
enable_if_t< is_void_v< T >, future_result_t< T > > get(future< T > &f)
通用future结果获取函数
constexpr use_awaitable_t use_awaitable
use_awaitable 常量
constexpr use_future_t use_future
use_future 常量
void * native_handle_type
系统句柄类型
duration< int64_t, milli > milliseconds
毫秒持续时间
int64_t ssize_t
有符号大小类型
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针
统一异步操作核心
IP协议族Socket基类
完成令牌 trait 主模板
fire-and-forget 完成令牌
协程 awaitable 完成令牌
返回 future<T> 的完成令牌
协程 awaitable 完成令牌
动态大小数组容器