c++ - boost::asio::ssl::stream<tcp::socket> is closed before read -
i'm trying write synchronous ssl client. here code:
class chttpssession { public: chttpssession(io_service& io_service, ssl::context &context, tcp::resolver::iterator endpoint_iterator) : m_socket(io_service, context) { error_code error = error::host_not_found; tcp::resolver::iterator end; while (error && endpoint_iterator != end) { m_socket.lowest_layer().close(); m_socket.lowest_layer().connect(*endpoint_iterator++, error); } if (error) { throw system_error(error); } m_socket.handshake(ssl::stream_base::client); } void sendrequest(chttprequest& request) { write(m_socket, request.getrequest()); } void receiveresponse(chttpresponse& response) { streambuf reply; error_code error; read(m_socket, reply, transfer_all(), error); //here error received if (error && error != error::eof) throw system_error(error); response.init(reply); } private: ssl::stream<tcp::socket> m_socket; } int main(int argc, char* argv[]) { try { io_service io_service; string server = "some server here"; string port = "some port here"; tcp::resolver resolver(io_service); tcp::resolver::query query(std::string(server), std::to_string(port)); tcp::resolver::iterator endpoint_iterator = resolver.resolve(query); ssl::context ctx(io_service, ssl::context_base::sslv23_client); ctx.use_certificate_chain_file("path certificate file"); ctx.set_verify_mode(ssl::context_base::verify_none); auto session = new chttpssession(io_service, ctx, endpoint_iterator); chttprequest request; chttpresonse response; //request initialization session.sendrequest(request); session.receiveresponse(response); } catch (boost::system::system_error& exc) { cout<< exc.what() << std::endl; } }
but trying read data socket following error: request send or receive data disallowed because socket had been shut down in direction previous shutdown call.
i use similar code non-ssl client , works.
am missing something?
update:
found ssl stream closed: underlying tcp socket still open, data available through it, since encrypted, can't use it.
Comments
Post a Comment