acl/lib_acl_cpp/samples/aio/aio_client_ssl/main.cpp

428 lines
9.9 KiB
C++
Raw Normal View History

#include <iostream>
#include <assert.h>
#if defined(_WIN32) || defined(_WIN64)
#include <io.h>
#endif
#include "lib_acl.h"
#include "acl_cpp/acl_cpp_init.hpp"
#include "acl_cpp/stdlib/log.hpp"
#include "acl_cpp/stdlib/string.hpp"
#include "acl_cpp/stdlib/util.hpp"
#include "acl_cpp/stream/polarssl_conf.hpp"
#include "acl_cpp/stream/polarssl_io.hpp"
#include "acl_cpp/stream/mbedtls_conf.hpp"
#include "acl_cpp/stream/mbedtls_io.hpp"
#include "acl_cpp/stream/aio_handle.hpp"
#include "acl_cpp/stream/aio_socket_stream.hpp"
#ifdef WIN32
# ifndef snprintf
# define snprintf _snprintf
# endif
#endif
static acl::sslbase_conf* __ssl_conf;
typedef struct
{
acl::aio_handle* handle;
2019-06-16 20:10:40 +08:00
char addr[64];
int connect_timeout;
int read_timeout;
int nopen_limit;
int nopen_total;
int nwrite_limit;
int nwrite_total;
int nread_total;
int id_begin;
bool debug;
} IO_CTX;
static bool connect_server(IO_CTX* ctx, int id);
/**
* <EFBFBD>ͻ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
class client_io_callback : public acl::aio_open_callback
{
public:
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param ctx {IO_CTX*}
* @param client {aio_socket_stream*} <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param id {int} <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ID<EFBFBD><EFBFBD>
*/
client_io_callback(IO_CTX* ctx, acl::aio_socket_stream* client, int id)
2019-06-16 20:10:40 +08:00
: client_(client)
, ctx_(ctx)
, nwrite_(0)
, id_(id)
{
}
2019-06-16 20:10:40 +08:00
~client_io_callback(void)
{
std::cout << ">>>ID: " << id_ << ", io_callback deleted now!" << std::endl;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ô˻ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param data {char*} <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>ַ
* @param len {int<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD><EFBFBD>
* @return {bool} <EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
bool read_callback(char* data, int len)
{
(void) len;
ctx_->nread_total++;
2019-06-16 20:10:40 +08:00
if (ctx_->debug) {
if (nwrite_ < 10) {
std::cout << "gets(" << nwrite_ << "): " << data;
2019-06-16 20:10:40 +08:00
} else if (nwrite_ % 2000 == 0) {
std::cout << ">>ID: " << id_ << ", I: "
<< nwrite_ << "; "<< data;
2019-06-16 20:10:40 +08:00
}
}
// <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>ҲӦ<D2B2>˳<EFBFBD>
2019-06-16 20:10:40 +08:00
if (acl::strncasecmp_(data, "quit", 4) == 0) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
client_->format("Bye!\r\n");
// <20>ر<EFBFBD><D8B1><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
client_->close();
2019-06-16 20:10:40 +08:00
return true;
}
2019-06-16 20:10:40 +08:00
if (nwrite_ >= ctx_->nwrite_limit) {
if (ctx_->debug) {
std::cout << "ID: " << id_
<< ", nwrite: " << nwrite_
<< ", nwrite_limit: " << ctx_->nwrite_limit
<< ", quiting ..." << std::endl;
2019-06-16 20:10:40 +08:00
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD>Ϣ
client_->format("quit\r\n");
client_->close();
2019-06-16 20:10:40 +08:00
} else {
char buf[256];
snprintf(buf, sizeof(buf), "hello world: %d\n", nwrite_);
client_->write(buf, (int) strlen(buf));
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//client_->format("hello world: %d\n", nwrite_);
}
2019-06-16 20:10:40 +08:00
return true;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD>ɹ<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ô˻ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @return {bool} <EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
2019-06-16 20:10:40 +08:00
bool write_callback(void)
{
ctx_->nwrite_total++;
nwrite_++;
// <20>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
client_->gets(ctx_->read_timeout, false);
2019-06-16 20:10:40 +08:00
return true;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ر<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD>ô˻ص<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
2019-06-16 20:10:40 +08:00
void close_callback(void)
{
2019-06-16 20:10:40 +08:00
if (!client_->is_opened()) {
std::cout << "Id: " << id_ << " connect "
<< ctx_->addr << " error: "
<< acl::last_serror();
// <20><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Ӿ<EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>˳<EFBFBD>
2019-06-16 20:10:40 +08:00
if (ctx_->nopen_total == 0) {
std::cout << ", first connect error, quit";
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˳<EFBFBD>״̬ */
client_->get_handle().stop();
}
std::cout << std::endl;
delete this;
return;
}
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD><DCBC>ص<EFBFBD><D8B5><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int nleft = client_->get_handle().length();
2019-06-16 20:10:40 +08:00
if (ctx_->nopen_total == ctx_->nopen_limit && nleft == 1) {
std::cout << "Id: " << id_ << " stop now! nstream: "
<< nleft << std::endl;
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>˳<EFBFBD>״̬ */
client_->get_handle().stop();
}
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ˴<DAB4>ɾ<EFBFBD><C9BE><EFBFBD>ö<EFBFBD>̬<EFBFBD><CCAC><EFBFBD><EFBFBD><EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Է<EFBFBD>ֹ<EFBFBD>ڴ<EFBFBD>й¶
delete this;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱʱ<EFBFBD><EFBFBD><EFBFBD>ô˺<EFBFBD><EFBFBD><EFBFBD>
* @return {bool} <EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
2019-06-16 20:10:40 +08:00
bool timeout_callback(void)
{
std::cout << "Connect " << ctx_->addr << " Timeout ..." << std::endl;
client_->close();
2019-06-16 20:10:40 +08:00
return false;
}
2019-06-16 20:10:40 +08:00
bool read_wakeup(void)
{
acl::polarssl_io* hook = (acl::polarssl_io*) client_->get_hook();
2019-06-16 20:10:40 +08:00
if (hook == NULL) {
std::cout << "get hook error"<< std::endl;
return false;
}
// <20><><EFBFBD>Խ<EFBFBD><D4BD><EFBFBD> SSL <20><><EFBFBD><EFBFBD>
2019-06-16 20:10:40 +08:00
if (!hook->handshake()) {
logger_error("ssl handshake failed");
return false;
}
// <20><><EFBFBD><EFBFBD> SSL <20><><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD><D1BE>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>
2019-06-16 20:10:40 +08:00
if (hook->handshake_ok()) {
printf("ssl handshake ok\r\n");
// <20><> reactor ģʽתΪ proactor ģʽ<C4A3><CABD><EFBFBD>Ӷ<EFBFBD>ȡ<EFBFBD><C8A1>
// read_wakeup <20>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
client_->disable_read();
char buf[256];
snprintf(buf, sizeof(buf), "hello world: %d\n", nwrite_);
client_->write(buf, (int) strlen(buf));
// <20><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
client_->gets(ctx_->read_timeout, false);
return true;
}
// SSL <20><><EFBFBD>ֻ<EFBFBD>δ<EFBFBD><CEB4><EFBFBD>ɣ<EFBFBD><C9A3>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴα<D9B4><CEB1><EFBFBD><EFBFBD><EFBFBD>
return true;
}
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳɹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô˺<EFBFBD><EFBFBD><EFBFBD>
* @return {bool} <EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> true <EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD><EFBFBD>Ҫ<EFBFBD>ر<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
2019-06-16 20:10:40 +08:00
bool open_callback(void)
{
// <20><><EFBFBD>ӳɹ<D3B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IO<49><4F>д<EFBFBD>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD>
client_->add_read_callback(this);
client_->add_write_callback(this);
ctx_->nopen_total++;
acl::assert_(id_ > 0);
2019-06-16 20:10:40 +08:00
if (ctx_->nopen_total < ctx_->nopen_limit) {
// <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ӹ<EFBFBD><D3B9><EFBFBD>
2019-06-16 20:10:40 +08:00
if (connect_server(ctx_, id_ + 1) == false) {
std::cout << "connect error!" << std::endl;
2019-06-16 20:10:40 +08:00
}
}
// <20><><EFBFBD><EFBFBD> SSL <20><>ʽ
2019-06-16 20:10:40 +08:00
if (__ssl_conf) {
acl::sslbase_io* ssl = __ssl_conf->create(true);
2019-06-16 20:10:40 +08:00
if (client_->setup_hook(ssl) == ssl) {
std::cout << "open ssl error!" << std::endl;
ssl->destroy();
return false;
}
2019-06-16 20:10:40 +08:00
if (!ssl->handshake()) {
client_->remove_hook();
ssl->destroy();
return false;
}
// <20><><EFBFBD><EFBFBD> SSL <20><><EFBFBD>ֽ׶<D6BD>
2019-06-16 20:10:40 +08:00
client_->read_wait(ctx_->read_timeout);
return true;
}
// <20><EFBFBD><ECB2BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//client_->format("hello world: %d\n", nwrite_);
char buf[256];
snprintf(buf, sizeof(buf), "hello world: %d\n", nwrite_);
client_->write(buf, (int) strlen(buf));
// <20><EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
client_->gets(ctx_->read_timeout, false);
// <20><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><ECB2BD><EFBFBD><EFBFBD>
2019-06-16 20:10:40 +08:00
return true;
}
private:
acl::aio_socket_stream* client_;
IO_CTX* ctx_;
2019-06-16 20:10:40 +08:00
int nwrite_;
int id_;
};
static bool connect_server(IO_CTX* ctx, int id)
{
// <20><>ʼ<EFBFBD><EFBFBD><ECB2BD><EFBFBD><EFBFBD>Զ<EFBFBD>̷<EFBFBD><CCB7><EFBFBD><EFBFBD><EFBFBD>
2019-06-16 20:10:40 +08:00
acl::aio_socket_stream* stream = acl::aio_socket_stream::open
(ctx->handle, ctx->addr, ctx->connect_timeout);
if (stream == NULL) {
std::cout << "connect " << ctx->addr << " error!" << std::endl;
std::cout << "stoping ..." << std::endl;
2019-06-16 20:10:40 +08:00
if (id == 0) {
ctx->handle->stop();
2019-06-16 20:10:40 +08:00
}
return false;
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӻ<EFBFBD><D3BA>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
client_io_callback* callback = new client_io_callback(ctx, stream, id);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳɹ<D3B3><C9B9>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stream->add_open_callback(callback);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܺ<EFBFBD><DCBA>ص<EFBFBD><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stream->add_close_callback(callback);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD>ʱ<EFBFBD>Ļص<C4BB><D8B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
stream->add_timeout_callback(callback);
2019-06-16 20:10:40 +08:00
return true;
}
static void usage(const char* procname)
{
2019-06-16 20:10:40 +08:00
printf("usage: %s -h[help]\r\n"
" -l server_addr\r\n"
" -c nconnect\r\n"
" -n io_max\r\n"
" -k[use kernel event: epoll/kqueue/devpoll\r\n"
" -t connect_timeout\r\n"
" -d[debug]\r\n"
" -S libssl_path [if set the ssl will be used]\n",
2019-06-16 20:10:40 +08:00
procname);
}
int main(int argc, char* argv[])
{
bool use_kernel = false;
int ch;
IO_CTX ctx;
2019-06-16 20:10:40 +08:00
acl::string libssl_path;
memset(&ctx, 0, sizeof(ctx));
ctx.connect_timeout = 5;
2019-06-16 20:10:40 +08:00
ctx.nopen_limit = 10;
ctx.id_begin = 1;
ctx.nwrite_limit = 10;
ctx.debug = false;
snprintf(ctx.addr, sizeof(ctx.addr), "127.0.0.1:9001");
2019-06-16 20:10:40 +08:00
while ((ch = getopt(argc, argv, "hc:n:kl:dt:S:")) > 0) {
switch (ch) {
case 'c':
ctx.nopen_limit = atoi(optarg);
if (ctx.nopen_limit <= 0) {
ctx.nopen_limit = 10;
}
break;
case 'n':
ctx.nwrite_limit = atoi(optarg);
if (ctx.nwrite_limit <= 0) {
ctx.nwrite_limit = 10;
}
break;
case 'h':
usage(argv[0]);
return 0;
case 'k':
use_kernel = true;
break;
case 'l':
snprintf(ctx.addr, sizeof(ctx.addr), "%s", optarg);
break;
case 'd':
ctx.debug = true;
break;
case 't':
ctx.connect_timeout = atoi(optarg);
break;
case 'S':
2019-06-16 20:10:40 +08:00
libssl_path = optarg;
break;
default:
break;
}
}
acl::meter_time(__FUNCTION__, __LINE__, "-----BEGIN-----");
acl::acl_cpp_init();
acl::log::stdout_open(true);
__ssl_conf = NULL;
if (libssl_path.empty()) {
/* do nothing */
} else if (libssl_path.find("mbedtls") != NULL) {
const std::vector<acl::string>& libs = libssl_path.split2("; \t\r\n");
if (libs.size() == 3) {
acl::mbedtls_conf::set_libpath(libs[0], libs[1], libs[2]);
if (acl::mbedtls_conf::load()) {
__ssl_conf = new acl::mbedtls_conf(false);
} else {
printf("load %s error\r\n", libssl_path.c_str());
}
} else {
printf("invalid libssl_path=%s\r\n", libssl_path.c_str());
}
} else {
// <20><><EFBFBD><EFBFBD> libpolarssl.so <20><>ȫ·<C8AB><C2B7>
2019-06-16 20:10:40 +08:00
acl::polarssl_conf::set_libpath(libssl_path);
// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD> libpolarssl.so <20><>
2019-06-16 20:10:40 +08:00
acl::polarssl_conf::load();
// <20><><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB> SSL <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2019-06-16 20:10:40 +08:00
__ssl_conf = new acl::polarssl_conf();
}
acl::aio_handle handle(use_kernel ? acl::ENGINE_KERNEL : acl::ENGINE_SELECT);
ctx.handle = &handle;
2019-06-16 20:10:40 +08:00
if (!connect_server(&ctx, ctx.id_begin)) {
std::cout << "enter any key to exit." << std::endl;
getchar();
return 1;
}
std::cout << "Connect " << ctx.addr << " ..." << std::endl;
2019-06-16 20:10:40 +08:00
while (true) {
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> false <20><><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ټ<EFBFBD><D9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD>˳<EFBFBD>
if (!handle.check()) {
break;
2019-06-16 20:10:40 +08:00
}
}
acl::string buf;
buf << "total open: " << ctx.nopen_total
<< ", total write: " << ctx.nwrite_total
<< ", total read: " << ctx.nread_total;
acl::meter_time(__FUNCTION__, __LINE__, buf.c_str());
delete __ssl_conf;
return 0;
}