acl  3.5.3.0
polarssl_io.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include "sslbase_io.hpp"
4 
5 struct ACL_VSTREAM;
6 
7 namespace acl {
8 
9 class polarssl_conf;
10 
11 /**
12  * stream/aio_stream 流对象底层 IO 处理过程的处理类,该类对象中的读写的过程将会替代
13  * stream/aio_stream 流对象中 默认的底层 IO 过程;该类对象必须是动态创建的(即为堆对象),
14  * stream/aio_stream 流对象通过调用本类对象的 destroy() 方法释放本类对象
15  */
17 {
18 public:
19  /**
20  * 构造函数
21  * @param conf {polarssl_conf&} 对每一个 SSL 连接进行配置的类对象
22  * @param server_side {bool} 是否为服务端模式,因为客户端模式与服务端
23  * 模式的握手方法不同,所以通过此参数来进行区分
24  * @param nblock {bool} 是否为非阻塞模式
25  */
26  polarssl_io(polarssl_conf& conf, bool server_side, bool nblock = false);
27 
28  /**
29  * @override stream_hook
30  * 销毁 SSL IO 对象
31  */
32  void destroy(void);
33 
34  /**
35  * @override sslbase_io
36  * 调用此方法进行 SSL 握手,在非阻塞 IO 模式下该函数需要与 handshake_ok()
37  * 函数组合使用来判断 SSL 握手是否成功
38  * @return {bool}
39  * 1、返回 false 表示握手失败,需要关闭连接;
40  * 2、当返回 true 时:
41  * 2.1、如果为阻塞 IO 模式则表示 SSL 握手成功
42  * 2.2、在非阻塞 IO 模式下仅代表本次握手过程中 IO 是成功的,还需要调用
43  * handshake_ok() 函数判断 SSL 握手是否成功
44  */
45  bool handshake(void);
46 
47  /**
48  * 检查对方证书是否有效(一般不必调用此函数)
49  * @return {bool}
50  */
51  bool check_peer(void);
52 
53 protected:
54  ~polarssl_io(void);
55 
56  // 实现 stream_hook 类的虚方法
57 
58  // @override stream_hook
59  bool open(ACL_VSTREAM* s);
60 
61  // @override stream_hook
62  bool on_close(bool alive);
63 
64  // @override stream_hook
65  int read(void* buf, size_t len);
66 
67  // @override stream_hook
68  int send(const void* buf, size_t len);
69 
70 private:
71  polarssl_conf& conf_;
72  void* ssl_;
73  void* ssn_;
74  void* rnd_;
75 
76 private:
77  static int sock_read(void *ctx, unsigned char *buf, size_t len);
78  static int sock_send(void *ctx, const unsigned char *buf, size_t len);
79 };
80 
81 } // namespace acl
#define ACL_CPP_API