我想通过SSL连接发送未经请求的消息.这意味着服务器不是基于来自客户端的请求发送消息,而是因为发生了客户端需要知道的某些事件.
我只是使用来自boost站点的SSL服务器示例,添加了一个在10秒后发送'hello'的计时器,在计时器到期之前一切正常(服务器echo的所有内容),'hello'也被收到,但之后应用程序在下次将文本发送到服务器时崩溃.
对我来说更奇怪的是,当我禁用SSL代码时,所以使用普通套接字并使用telnet执行相同操作,它可以正常工作并继续正常工作!
我现在第二次遇到这个问题了,我真的不知道为什么会发生这种情况.
以下是我为证明问题而改变的总来源.编译它没有SSL定义并使用telnet,一切正常,定义SSL并使用openssl,或来自boost网站的客户端SSL示例,事情崩溃.
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
//#define SSL
typedef boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssl_socket;
class session
{
public:
session(boost::asio::io_service& io_service,
boost::asio::ssl::context& context)
#ifdef SSL
: socket_(io_service, context)
#else
: socket_(io_service)
#endif
{
}
ssl_socket::lowest_layer_type& socket()
{
return socket_.lowest_layer();
}
void start()
{
#ifdef SSL
socket_.async_handshake(boost::asio::ssl::stream_base::server,
boost::bind(&session::handle_handshake, this,
boost::asio::placeholders::error));
#else
socket_.async_read_some(boost::asio::buffer(data_, max_length),
boost::bind(&session::handle_read, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
boost::shared_ptr< boost::asio::deadline_timer > timer(new boost::asio::deadline_timer( socket_.get_io_service() ));
timer->expires_from_now( boost::posix_time::seconds( 10 ) );
timer->async_wait( boost::bind( &session::SayHello, this, _1, timer ) …Run Code Online (Sandbox Code Playgroud)