1#ifndef NEFORCE_NETWORK_TCP_TCP_SOCKET_HPP__
2#define NEFORCE_NETWORK_TCP_TCP_SOCKET_HPP__
18NEFORCE_BEGIN_NAMESPACE__
184 NEFORCE_NODISCARD
virtual bool is_ssl() const noexcept {
return false; }
295 template <
typename Token, enable_if_t<!is_same_v<decay_t<Token>, function<
void(error_code,
size_t)>>,
int> = 0>
307 template <
typename Token, enable_if_t<!is_same_v<decay_t<Token>, function<
void(error_code,
size_t)>>,
int> = 0>
321 template <
typename Token, enable_if_t<!is_same_v<decay_t<Token>, function<
void(error_code)>>,
int> = 0>
347#ifdef NEFORCE_STANDARD_20
366struct future_handler<error_code, tcp_socket> {
367 shared_ptr<promise<tcp_socket>> promise_;
369 void operator()(error_code ec, tcp_socket sock) {
371 promise_->set_exception(_NEFORCE make_exception_ptr(system_exception(ec)));
373 promise_->set_value(
move(sock));
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 ) { handler_.promise_ = make_shared<promise<tcp_socket>>(); }
386 handler_type get_handler() {
return handler_; }
387 return_type
get() {
return handler_.promise_->get_future(); }
392NEFORCE_END_NAMESPACE__
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_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
毫秒持续时间
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()))
获取容器的底层数据指针