acl/lib_acl_cpp/include/acl_cpp/stream/sslbase_io.hpp
2022-08-19 10:28:04 +08:00

72 lines
1.5 KiB
C++

#pragma once
#include "../acl_cpp_define.hpp"
#include "../stdlib/string.hpp"
#include "stream_hook.hpp"
struct ACL_VSTREAM;
namespace acl {
class sslbase_conf;
class atomic_long;
class ACL_CPP_API sslbase_io : public stream_hook {
public:
/**
* 构造函数
* @param conf {sslbase_conf&} 对每一个 SSL 连接进行配置的类对象
* @param server_side {bool} 是否为服务端模式,因为客户端模式与服务端
* 模式的握手方法不同,所以通过此参数来进行区分
* @param nblock {bool} 是否为非阻塞模式
*/
sslbase_io(sslbase_conf& conf, bool server_side, bool nblock = false);
virtual ~sslbase_io(void);
/**
* ssl 握手纯虚方法
* @return {bool}
*/
virtual bool handshake(void) = 0;
/**
* 设置套接字为阻塞模式/非阻塞模式
* @param yes {bool} 当为 false 时则设为阻塞模式,否则设为非阻塞模式
*/
void set_non_blocking(bool yes);
/**
* 判断当前设置的 SSL IO 是否阻塞模式还是非阻塞模式
* @return {bool} 返回 true 则表示为非阻塞模式,否则为阻塞模式
*/
bool is_non_blocking(void) const
{
return nblock_;
}
/**
* 判断 SSL 握手是否成功
* @return {bool}
*/
bool handshake_ok(void)
{
return handshake_ok_;
}
/**
* 设置 SNI HOST 字段
* @param host {const char*}
*/
void set_sni_host(const char* host);
protected:
sslbase_conf& base_conf_;
bool server_side_;
bool nblock_;
bool handshake_ok_;
atomic_long* refers_;
ACL_VSTREAM* stream_;
string sni_host_; // just for SNI
};
} // namespace acl