下面是SSL上下文初始化和验证回调注册的代码片段.如果我使用适当的证书连接SSL客户端,它将验证证书并按预期工作.
但是,如果我连接没有任何证书的客户端,那么它允许连接(实际上它不应该允许没有证书的连接).如果SSL客户端不发送证书,则它不会调用验证回调.
boost::asio::ssl::context_base::method SSL_version =
static_cast<boost::asio::ssl::context_base::method>(param_values[ID_PROTOCOL_VERSION].int32_value);
// load certificate files
boost::shared_ptr<boost::asio::ssl::context> context_ = boost::shared_ptr<boost::asio::ssl::context>(
new boost::asio::ssl::context(SSL_version)); // parasoft-suppress BD-RES-LEAKS "The memory is allocated via boost::shared_ptr, hence it'll be deallocated automatically"
p_ctx = boost::static_pointer_cast<void>(context_);
context_->set_options(boost::asio::ssl::context::default_workarounds);
context_->use_certificate_chain_file(cert_chain_file);
context_->use_certificate_file(cert_file, boost::asio::ssl::context::pem);
context_->use_private_key_file(cert_file, boost::asio::ssl::context::pem);
context_->set_verify_mode(boost::asio::ssl::verify_peer);
context_->set_verify_callback(boost::bind(&verify_certificate_cb, _1, _2));
Run Code Online (Sandbox Code Playgroud)
verify_certificate_cb 回调函数
bool verify_certificate_cb(bool preverified, boost::asio::ssl::verify_context& ctx)
{
std::cout << "Function : " << __func__ << " ----------------- Line : " << __LINE__ << std::endl;
int8_t subject_name[256];
X509_STORE_CTX *cts = ctx.native_handle();
int32_t length = 0;
X509* cert …Run Code Online (Sandbox Code Playgroud) 下面是我使用boost asio的套接字服务器的示例代码.
此服务器将在端口10001上等待任何客户端连接.当任何客户端连接时,它将启动线程从该客户端读取并等待另一个客户端.但是,当我的客户端断开服务器套接字时,会发生什么情况my_socket->close().
如果新客户端尝试连接服务器崩溃.
我正在使用 g ++(Ubuntu 4.4.3-4ubuntu5.1)4.4.3
#include <ctime>
#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include <sys/socket.h>
#include <unistd.h>
#include <string>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/date_time.hpp>
using namespace std;
using boost::asio::ip::tcp;
void run(boost::shared_ptr<tcp::socket> my_socket)
{
while (1)
{
char buf[128];
boost::system::error_code error;
size_t len = my_socket->read_some(boost::asio::buffer(buf, 128), error);
std::cout << "len : " << len << std::endl;
if (error == boost::asio::error::eof)
{
cout << "\t(boost::asio::error::eof)" << endl;
if (my_socket->is_open())
{
boost::system::error_code ec;
cout << "\tSocket closing" …Run Code Online (Sandbox Code Playgroud) 我的接口层次结构如下:
class A
{
public:
void foo() = 0;
};
class B: public A
{
public:
void testB() = 0;
};
class C: public A
{
public:
void testC() = 0;
};
Run Code Online (Sandbox Code Playgroud)
现在,我想通过相同的层次结构(即基类)实现这些接口AImpl,BImpl但CImpl我不确定如何从相应的接口派生它们。
请帮忙。提前致谢。