【问题标题】:Making SSL Connection using Boost Asio使用 Boost Asio 建立 SSL 连接
【发布时间】:2016-10-21 12:56:13
【问题描述】:

基本上有代码可以对服务器进行 http 调用并处理响应,但我想保护数据传输并进行 https 调用。

为此,我有这个 executor.hpp

class Executor
{
public :
  Executor(Cli &cli):ssock(svc)
  {
      //! Get a list of endpoints corresponding to the server name.
    boost::asio::ip::tcp::resolver resolver(svc);
    boost::asio::ip::tcp::resolver::query query(cli.getIP(), "8080");
    endpoint_iterator = resolver.resolve(query);
  }

  int connect();
  int write(RequestCreator &requestcreator);

boost::asio::ssl::stream<boost::asio::ip::tcp::socket> &getSocket() { return    ssock; }

private :

boost::asio::io_service svc;
boost::asio::ssl::context ctx(svc, ssl::context::method::sslv23_client);
boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssock(svc, ctx);
boost::asio::ip::tcp::resolver::iterator endpoint_iterator;

};

还有这个 executor.cpp

int Executor::connect()
{
  boost::system::error_code ec ;
  boost::asio::connect(ssock.lowest_layer(), endpoint_iterator );
  ssock.handshake(boost::asio::ssl::stream_base::handshake_type::client);

  if (ec)
  {
    ssock.lowest_layer().close();
    svc.stop();
    return 0;
  }
  return 1;
 }

 int Executor::write(RequestCreator &requestCreator)
 {
   boost::system::error_code ec ;
   boost::asio::write(ssock, requestCreator.getRequest(), ec);
   if (ec)
   {
     ssock.lowest_layer().close();
     svc.stop();
     return 0;
   }
  return 1;
}

以下是编译器的完整错误

c:\cygwin64\home\admin\sandbox\webcli\executor.hpp(30) : error C2061:   syntax error : identifier 'svc'
c:\cygwin64\home\admin\sandbox\webcli\executor.hpp(31) : error C2061: syntax error : identifier 'svc'
c:\cygwin64\home\admin\sandbox\webcli\executor.hpp(15) : error C2436: 'ssock' : member function or nested class in constructor initializer list
c:\cygwin64\home\admin\sandbox\webcli\executor.hpp(25) : error C3867: 'Executor::ssock': function call missing argument list; use '&Executor::ssock' to create a pointer to member
c:\cygwin64\home\admin\sandbox\webcli\executor.hpp(25) : error C2440:  'return' : cannot convert from 'boost::asio::ssl::stream<Stream> (__cdecl   Executor::* )(void)' to 'boost::asio::ssl::stream<Stream> &'
    with
    [
        Stream=boost::asio::ip::tcp::socket
    ]

【问题讨论】:

  • 你……没有问问题。
  • 我看到了编辑。让我们阅读
  • 好的,我已经读过了。这个问题是无法解决的。没有任何代码有意义,并且错误根本与“代码”无关。看我的回答。
  • 与其转储代码,不如考虑花费额外的时间和精力来提供格式清晰的minimal reproducible example。它可以帮助每个人的时间更有效率,甚至可以帮助您在此过程中自行解决问题。例如,here 是基于相关代码的 MCVE。
  • 我现在在病房里会记住这一点,谢谢! @TannerSansbury 但你能说出代码有什么问题吗?我的意思是错误

标签: c++ ssl boost boost-asio


【解决方案1】:
  1. 错误消息指的是一个不在您的代码中的类Executor。你在编译正确的东西吗?

  2. boost::asio::ssl::context ctx(svc, ssl::context::method::sslv23_client);

    这不应该编译,除非svc 也是你代码中的一个类型。使用大括号。

  3. boost::asio::ssl::stream&lt;boost::asio::ip::tcp::socket&gt; ssock(svc, ctx);

    这肯定不会编译。同样的问题。

  4. Connect(Data &amp;data) : socket(ioService) {

    • 未声明套接字。它是什么? (假设您的意思可能是ssock)。
    • ioService 未声明。它是什么? (假设您的意思可能是svc)。
  5. 对比

     int Connect::write(CreatRequest &requestCreator) {
    

    与

     int write(RequestCreator &requestcreator);
    

    它是什么?编译器不会猜到你的意思。如果您的意思是RequestCreator,您将不得不输入,而不是CreatRequest。

总而言之,没有真正的问题,只是大量盲目复制/粘贴“类似代码”的文本。

以最直接的方式解决上述所有问题:

Live On Coliru

#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>

struct Data {
    std::string getIP() const { return "localhost"; }
};


class Connect {
  public:
    Connect(Data &data) {
        //! Get a list of endpoints corresponding to the server name.
        boost::asio::ip::tcp::resolver resolver(svc);
        boost::asio::ip::tcp::resolver::query query(data.getIP(), "8080");
        endpoint_iterator = resolver.resolve(query);
    }

    int connectServer();
    struct RequestCreator {
        auto getRequest() const { return boost::asio::buffer("GET / HTTP/1.1\r\n\r\n"); }
    };
    int write(RequestCreator &requestcreator);

    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> &getSocket() { return ssock; }

  private:
    boost::asio::io_service svc;
    boost::asio::ssl::context ctx{svc, boost::asio::ssl::context::method::sslv23_client};
    boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssock{svc, ctx};
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator;
};

int Connect::connectServer() {
    boost::system::error_code ec;

    boost::asio::connect(ssock.lowest_layer(), endpoint_iterator);
    if (ec) {
        ssock.lowest_layer().close();
        svc.stop();
        return 0;
    }
    return 1;
}

int Connect::write(RequestCreator &requestCreator) {
    boost::system::error_code ec;

    boost::asio::write(ssock, requestCreator.getRequest(), ec);
    if (ec) {
        ssock.lowest_layer().close();
        svc.stop();
        return 0;
    }
    return 1;
}

main() {
    Data data;
    Connect c(data);
}

【讨论】:

  • 实际上类名是 executor 我已将其更改为将问题发布到 Connect @sehe
  • 好的,让我们让您直接轻松地理解并与问题联系起来,我正在编辑问题,这次有完整的错误和代码堆栈
  • 编辑基本上解决了我的回答方式中的一些问题。答案不变。正如您所看到的live on Coliru 一直以来,我生成的代码一直有效。
  • 这很好,但我想我必须深入了解我的开发环境提供给我的东西!
  • 你的环境是如何编译的!我仍然收到如下错误 executor.hpp(30) : error C2473: 'ctx' : 看起来像一个函数定义,但没有参数列表。 executor.hpp(30):错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int executor.hpp(30):错误 C2143:语法错误:缺少 ';'在 '}' executor.hpp(30) 之前:错误 C2602:'sslv23_client' 不是 'Executor' 基类的成员
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-14
  • 2012-02-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-22
  • 2011-03-01
相关资源
最近更新 更多