Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::asio::ssl::stream<;tcp::socket>;在读取之前关闭_C++_Sockets_Ssl_Boost - Fatal编程技术网

C++ boost::asio::ssl::stream<;tcp::socket>;在读取之前关闭

C++ boost::asio::ssl::stream<;tcp::socket>;在读取之前关闭,c++,sockets,ssl,boost,C++,Sockets,Ssl,Boost,我正在尝试编写同步ssl客户端。这是我的密码: 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::

我正在尝试编写同步ssl客户端。这是我的密码:

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 is 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 to 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;
    }
}
class-chttpsession
{
公众:
chttpsession(io_服务和io_服务,ssl::context&context,tcp::resolver::迭代器端点迭代器):
m_套接字(io_服务、上下文)
{
error\u code error=错误::找不到主机;
tcp::resolver::迭代器端;
while(error&&endpoint\u迭代器!=end)
{
m_socket.lower_layer().close();
m_socket.lower_layer().connect(*endpoint_iterator++,error);
}
如果(错误)
{
抛出系统错误(错误);
}
m_socket.handshake(ssl::stream_base::client);
}
无效发送请求(CHttpRequest&request)
{
写入(m_套接字,request.getRequest());
}
无效接管人响应(CHTTP响应和响应)
{
streambuf回复;
错误\代码错误;
读取(m_socket,reply,transfer_all(),error);//这里是接收到的错误
if(error&&error!=error::eof)
抛出系统错误(错误);
答复.init(答复);
}
私人:
ssl::流m_套接字;
}
int main(int argc,char*argv[])
{
尝试
{
io_服务io_服务;
string server=“此处的某个服务器”;
string port=“此处的某个端口”;
tcp::解析器解析器(io_服务);
tcp::resolver::query查询(std::string(服务器),std::to_string(端口));
tcp::resolver::iterator endpoint_iterator=resolver.resolve(查询);
ssl::context ctx(io_服务,ssl::context_基::sslv23_客户端);
使用证书链文件(“证书文件路径”);
ctx.set_verify_mode(ssl::context_base::verify_none);
自动会话=新的chttpsession(io_服务、ctx、端点_迭代器);
请求请求;
HttpResonse反应;
//请求初始化
会话。发送请求(请求);
会议。接管人回复(回复);
}        
捕获(boost::system::system_错误和exc)
{

您是否检查了证书是否正常,协商有效?请尝试使用curl/wget/另一个HTTPS客户端(
openssl s\u客户端-验证n
)等等。看看出了什么问题。你的测试程序对我有效@sehe,是的,连接到google对我有效。实际上我正在尝试连接到另一个应用程序。有什么事情会导致从服务器端关闭ssl会话吗?同样的代码使用poco库而不是boost对同一台服务器有效。好的,poco数据点很有趣ing。也许你可以跟踪协商阶段。代码只是自我包含和可编译的。因此,它表明问题在于连接到特定服务器。这让我很生气。虽然
读取(m_socket,reply,transfer_all(),错误)
返回10058错误,缓冲区有效并且包含服务器响应。所以现在我已经为10058错误添加了条件:
if(error&&error!=error::eof&&error.value()!=10058)
。但我不明白为什么同时读取会返回此错误和缓冲区中的有效数据…我想这只是由于
传输所有
策略而导致的短暂读取。看看我在源代码中是如何处理的