c++ - 使用 Boost Asio 建立 SSL 连接

标签 c++ ssl boost boost-asio

基本上有代码可以对服务器进行 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
    ]

最佳答案

  1. 错误信息引用类Executor这不在您的代码中。你在编译正确的东西吗?

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

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

  3. boost::asio::ssl::stream<boost::asio::ip::tcp::socket> ssock(svc, ctx);

    这绝对不会编译。同样的问题。

  4. Connect(Data &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);
}

关于c++ - 使用 Boost Asio 建立 SSL 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40232658/

相关文章:

c++ - 在命令行编译c++ boost测试程序

c++ - 从原始指针创建 weak_ptr<>

c++ - 使用自定义获取属性 boost 动态属性

c++ - Visual Studio _MSC_VER 与平台工具集

python - 使用 PySocks 和 Socks5 代理时如何禁用 SSL 证书验证?

wcf - Windows 8 应用程序和 WCF 休息服务之间的安全连接

facebook - 既然我们已经转移到 https,我们能否获得针对 http 站点的 fb 评论?

c++ - C++11 中的 3 默认成员弃用规则

相同类型的c++类成员

c++ - 如何计算插值三角曲面的主曲率?