ssl_test.cpp 3.7 KB
Newer Older
Y
youngwolf 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

#include <iostream>

//configuration
#define ASCS_SERVER_PORT		9527
#define ASCS_ASYNC_ACCEPT_NUM	5
//#define ASCS_FORCE_TO_USE_MSG_RECV_BUFFER //force to use the msg recv buffer
#define ASCS_ENHANCED_STABILITY
//#define ASCS_DEFAULT_PACKER replaceable_packer
//#define ASCS_DEFAULT_UNPACKER replaceable_unpacker
//configuration

#include <ascs/ext/ssl.h>
using namespace ascs;
using namespace ascs::ext;

#define QUIT_COMMAND	"quit"
#define RESTART_COMMAND	"restart"
#define RECONNECT_COMMAND "reconnect"

int main(int argc, const char* argv[])
{
	puts("Directories certs and client_certs must be in the current directory.");
	if (argc >= 2 && (0 == strcmp(argv[1], "--help") || 0 == strcmp(argv[1], "-h")))
		return 0;
	else
		puts("type " QUIT_COMMAND " to end.");

	service_pump sp;

	ssl_server server_(sp, asio::ssl::context::sslv23_server);
	server_.ssl_context().set_options(asio::ssl::context::default_workarounds | asio::ssl::context::no_sslv2 | asio::ssl::context::single_dh_use);
	server_.ssl_context().set_verify_mode(asio::ssl::context::verify_peer | asio::ssl::context::verify_fail_if_no_peer_cert);
	server_.ssl_context().load_verify_file("client_certs/server.crt");
	server_.ssl_context().use_certificate_chain_file("certs/server.crt");
	server_.ssl_context().use_private_key_file("certs/server.key", asio::ssl::context::pem);
	server_.ssl_context().use_tmp_dh_file("certs/dh1024.pem");

///*
	//method #1
	ssl_client client_(sp, asio::ssl::context::sslv23_client);
	client_.ssl_context().set_options(asio::ssl::context::default_workarounds | asio::ssl::context::no_sslv2 | asio::ssl::context::single_dh_use);
	client_.ssl_context().set_verify_mode(asio::ssl::context::verify_peer | asio::ssl::context::verify_fail_if_no_peer_cert);
	client_.ssl_context().load_verify_file("certs/server.crt");
	client_.ssl_context().use_certificate_chain_file("client_certs/server.crt");
	client_.ssl_context().use_private_key_file("client_certs/server.key", asio::ssl::context::pem);
	client_.ssl_context().use_tmp_dh_file("client_certs/dh1024.pem");

	//please config the ssl context before creating any clients.
	client_.add_client();
	client_.add_client();
//*/
/*
	//method #2
	//to use ssl_sclient, we must construct ssl context first.
	asio::ssl::context ctx(asio::ssl::context::sslv23_client);
	ctx.set_options(asio::ssl::context::default_workarounds | asio::ssl::context::no_sslv2 | asio::ssl::context::single_dh_use);
	ctx.set_verify_mode(asio::ssl::context::verify_peer | asio::ssl::context::verify_fail_if_no_peer_cert);
	ctx.load_verify_file("certs/server.crt");
	ctx.use_certificate_chain_file("client_certs/server.crt");
	ctx.use_private_key_file("client_certs/server.key", asio::ssl::context::pem);
	ctx.use_tmp_dh_file("client_certs/dh1024.pem");

	ssl_sclient client_(sp, ctx);
*/
	sp.start_service();
	while(sp.is_running())
	{
		std::string str;
		std::cin >> str;
		if (QUIT_COMMAND == str)
		{
			sp.stop_service(&client_);
			sleep(1);
			sp.stop_service();
		}
		else if (RESTART_COMMAND == str || RECONNECT_COMMAND == str)
			puts("I still not find a way to reuse a asio::ssl::stream,\n"
				"it can reconnect to the server, but can not re-handshake with the server,\n"
				"if somebody knows how to fix this defect, please tell me, thanks in advance.");
		/*
		else if (RESTART_COMMAND == str)
		{
			sp.stop_service(&client_);
			sleep(1);
			sp.stop_service();

			sp.start_service();
		}
		else if (RECONNECT_COMMAND == str)
			client_.graceful_close(true);
		*/
		else
			server_.broadcast_msg(str);
	}

	return 0;
}

//restore configuration
#undef ASCS_SERVER_PORT
#undef ASCS_ASYNC_ACCEPT_NUM
#undef ASCS_FORCE_TO_USE_MSG_RECV_BUFFER
#undef ASCS_ENHANCED_STABILITY
#undef ASCS_DEFAULT_PACKER
#undef ASCS_DEFAULT_UNPACKER
//restore configuration