1#ifndef MSTL_NETWORK_TCP_TCP_CLIENT_HPP__
2#define MSTL_NETWORK_TCP_TCP_CLIENT_HPP__
3#include "./dns/dns_client.hpp"
5#include "ssl_socket.hpp"
8class MSTL_API tcp_client {
10#ifdef MSTL_SUPPORT_OPENSSL__
11 using handle_sock_t = ssl_socket;
13 using handle_sock_t = tcp_socket;
17#ifdef MSTL_SUPPORT_OPENSSL__
18 ssl_context ssl_ctx_{};
20 handle_sock_t socket_{};
22 string connected_host_;
28 bool try_connect(
const string& host,
uint16_t port,
const string& ip,
bool ipv6);
31 explicit tcp_client() =
default;
32 explicit tcp_client(dns_client dns);
33#ifdef MSTL_SUPPORT_OPENSSL__
34 explicit tcp_client(ssl_context ctx);
40#ifdef MSTL_SUPPORT_OPENSSL__
41 void set_ssl_context(ssl_context ctx) { ssl_ctx_ =
_MSTL move(ctx); }
44 MSTL_NODISCARD
milliseconds recv_timeout()
const {
return receive_timeout_; }
45 MSTL_NODISCARD
milliseconds send_timeout()
const {
return send_timeout_; }
47 bool connect(
const string& host,
uint16_t port);
48 void close() noexcept;
50 MSTL_NODISCARD
bool is_connected() const noexcept {
return socket_.is_valid(); }
51 MSTL_NODISCARD
const string& connected_host() const noexcept {
return connected_host_; }
52 MSTL_NODISCARD
uint16_t connected_port() const noexcept {
return connected_port_; }
56 ssize_t receive(
void* buffer,
size_t length)
const;
58 bool receive_all(
string& out_data,
size_t expected_length = 0);
59 void receive_with_callback(function<
void(
const string&)> callback,
size_t buffer_size = 8192);
61 MSTL_NODISCARD
const handle_sock_t& socket() const noexcept {
return socket_; }
62 MSTL_NODISCARD handle_sock_t& socket() noexcept {
return socket_; }
unsigned short uint16_t
16位无符号整数类型
duration< int64_t, milli > milliseconds
毫秒持续时间
#define _MSTL
全局命名空间MSTL前缀
#define MSTL_END_NAMESPACE__
结束全局命名空间MSTL
#define MSTL_BEGIN_NAMESPACE__
开始全局命名空间MSTL
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result)
移动范围元素
MSTL_NODISCARD MSTL_ALWAYS_INLINE constexpr decltype(auto) data(Container &cont) noexcept(noexcept(cont.data()))
获取容器的底层数据指针