gpt4 book ai didi

c++ - Boost-beast websocket握手问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:38:56 56 4
gpt4 key购买 nike

我正在尝试与远程服务器建立 websocket 连接,但出现以下错误:WebSocket 握手被远程端拒绝

我正在关注这个例子:https://www.boost.org/doc/libs/1_70_0/libs/beast/example/websocket/client/sync/websocket_client_sync.cpp

对于以下服务器:https://api.hitbtc.com/#socket-api-reference

提前感谢您的帮助!

int main(int argc, char** argv) {
try
{
auto const host = "api.hitbtc.com";
auto const port = "443";

net::io_context ioc;
tcp::resolver resolver{ ioc };
websocket::stream<tcp::socket> ws{ ioc };

auto const results = resolver.resolve(host, port);

net::connect(ws.next_layer(), results.begin(), results.end());

// Perform the websocket handshake - this is where i presume the issue is.
ws.handshake(host, "/api/2/ws");

beast::flat_buffer buffer;
ws.read(buffer);
ws.close(websocket::close_code::normal);
std::cout << beast::make_printable(buffer.data()) << std::endl;
}
catch (std::exception const& e)
{
std::cerr << "Error: " << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

最佳答案

您必须提供 ssl 上下文。这是 example来自 boost.org,

这里是 api.hitbtc 握手和通过 JSON-RPC 获取货币信息的示例(我省略了证书加载):

#include <boost/beast/core.hpp>
#include <boost/beast/ssl.hpp>
#include <boost/beast/websocket.hpp>
#include <boost/beast/websocket/ssl.hpp>
#include <boost/asio/connect.hpp>
#include <boost/asio/ip/tcp.hpp>
#include <boost/asio/ssl/stream.hpp>
#include <cstdlib>
#include <iostream>
#include <string>

namespace beast = boost::beast; // from <boost/beast.hpp>
namespace http = beast::http; // from <boost/beast/http.hpp>
namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
namespace net = boost::asio; // from <boost/asio.hpp>
namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>

// Sends a WebSocket message and prints the response
int main(int argc, char** argv)
{
try
{
// Check command line arguments.
auto const host = "api.hitbtc.com";
auto const port = "443";
auto const rpcJson = R"({"method":"getCurrency", "params":{"currency":"ETH"},"id":0})";

// The io_context is required for all I/O
net::io_context ioc;

// The SSL context is required, and holds certificates
ssl::context ctx{ssl::context::tlsv12_client};

// This holds the root certificate used for verification
//load_root_certificates(ctx);

// These objects perform our I/O
tcp::resolver resolver{ioc};
websocket::stream<beast::ssl_stream<tcp::socket>> ws{ioc, ctx};

// Look up the domain name
auto const results = resolver.resolve(host, port);

// Make the connection on the IP address we get from a lookup
net::connect(ws.next_layer().next_layer(), results.begin(), results.end());

// Perform the SSL handshake
ws.next_layer().handshake(ssl::stream_base::client);

// Set a decorator to change the User-Agent of the handshake
ws.set_option(websocket::stream_base::decorator(
[](websocket::request_type& req)
{
req.set(http::field::user_agent,
std::string(BOOST_BEAST_VERSION_STRING) +
" websocket-client-coro");
}));

// Perform the websocket handshake
ws.handshake(host, "/api/2/ws");

// Our message in this case should be stringified JSON-RPC request
ws.write(net::buffer(std::string(rpcJson)));

// This buffer will hold the incoming message
beast::flat_buffer buffer;

// Read a message into our buffer
ws.read(buffer);

// Close the WebSocket connection
ws.close(websocket::close_code::normal);

// If we get here then the connection is closed gracefully

// The make_printable() function helps print a ConstBufferSequence
std::cout << beast::make_printable(buffer.data()) << std::endl;
}
catch(std::exception const& e)
{
std::cerr << "Error: " << e.what() << std::endl;
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}

您应该得到字符串化的 JSON-RPC 响应。在这种情况下,对于 getCurrency("ETH") 请求,响应将是:

{"jsonrpc":"2.0","result":{"id":"ETH","fullName":"Ethereum","crypto":true,"payinEnabled":true,"payinPaymentId":false,"payinConfirmations":2,"payoutEnabled":true,"payoutIsPaymentId":false,"transferEnabled":true,"delisted":false,"payoutFee":"0.0428"},"id":null}

关于c++ - Boost-beast websocket握手问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55886267/

56 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com