Повышение 1.67 — зверь::Ошибка websocket: устранено: Хост не найден (авторитетный)

#c #boost #websocket #raspberry-pi #boost-beast

Вопрос:

Я пытаюсь использовать beast::websocket для своего проекта Raspberry pi, где Rpi является веб-клиентом интернета вещей, а Microsoft Azure WebPubSub находится на стороне сервера.

Я новичок в C и системе Unix. К сожалению, я не смог найти так много полезных справочных проектов, использующих веб-сайт C .

Первое, что я хотел сделать, это использовать пример клиента beast::websocket для успешного подключения к тестовому серверу websocket.

Ниже приведен пример, который я использовал. зверь::пример веб-сайта 1.67

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

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

// Sends a WebSocket message and prints the response
int main(int argc, char** argv)
{
    try
    {
        // Check command line arguments.
        if(argc != 4)
        {
            std::cerr <<
                "Usage: websocket-client-sync <host> <port> <text>n" <<
                "Example:n" <<
                "    websocket-client-sync echo.websocket.org 80 "Hello, world!"n";
            return EXIT_FAILURE;
        }
        auto const host = argv[1];
        auto const port = argv[2];
        auto const text = argv[3];

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

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

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

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

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

        // Send the message
        ws.write(boost::asio::buffer(std::string(text)));

        // This buffer will hold the incoming message
        boost::beast::multi_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 buffers() function helps print a ConstBufferSequence
        std::cout << boost::beast::buffers(buffer.data()) << std::endl;
    }
    catch(std::exception constamp; e)
    {
        std::cerr << "Error: " << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;
}

 

Потому что echo.websocket.организация сейчас закрыта. Я использовал разные тестовые серверы.
Это командная строка для двух разных тестовых серверов websocket.

  1. sudo websocket-клиент-синхронизация стримера.финансы.yahoo.com 80 «Привет, мир!»

    Возвращено с ошибкой: поток WebSocket был изящно закрыт на обеих конечных точках

  2. sudo websocket-клиент-синхронизация demo.piesocket.com/v3/channel_1?api_key=oCdCMcMPQpbvNjUIzqtvF1d2X2okWpDQj4AwARJuAgtjhzKxVEjQU6IdCjwmamp;notify_self 80 «Привет, мир!»

    Возвращено с ошибкой: решение: Хост не найден (авторитетный)

I was able to connect both URLs with a websocket test client.
But unable to connect or keep connected through this beast example.

Especially, for the second server with an API key and forward slashes, I wasn’t even able to find a host.

I thought this could be something to do with those special characters not recognized as literal?

So so far these are what I have tried.

  1. Я попытался заменить / на /.
  2. Я указал хост в файле cpp (например, хост с автоконстанцией = «demo.piesocket.com/v3/channel_1?api_key=oCdCMcMPQpbvNjUIzqtvF1d2X2okWpDQj4AwARJuAgtjhzKxVEjQU6IdCjwmamp;notify_self»;)
  3. Используемый закодированный URL-адрес (напр. demo.piesocket.com/v3/channel_1?api_key=oCdCMcMPQpbvNjUIzqtvF1d2X2okWpDQj4AwARJuAgtjhzKxVEjQU6IdCjwm&notify_self)
  4. использовал порт 443 вместо 80
  5. попробовал пример secure beast::websocket по протоколу SSL для серверов wss.

Ничего не помогало…

В конце концов, мне нужно использовать URL-адрес Azure websocket с маркером доступа, который выглядит следующим образом

wss://lupo.webpubsub.azure.com/client/hubs/Hub?access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJ3c3M6Ly9sdXBvLndlYnB1YnN1Yi5henVyZS5jb20vY2xpZW50L2h1YnMvSHViIiwiaWF0IjoxNjMzNTc3ODA1LCJleHAiOjE2MzM1ODE0MDV9.1xGRvCsyc1QDTBWJ01PcTarx0judpa6ZuQ8

Поскольку это безопасный веб-сайт, я использовал этот пример, успешно скомпилированный с помощью sudo g — v websocket_client_sync_ssl.o-o wsstest-lpthread-lboost_system -lcrypto -lssl

Но никакой надежды. Тот же результат.. Ошибка: устранена: Хост не найден (авторитетный)

Я чувствую, что мне здесь не хватает чего-то довольно простого. Не могли бы вы мне помочь?!

Спасибо!

Комментарии:

1. В командной строке ожидается имя хоста, а не URL-адрес, вам нужно будет изменить пример, если вы хотите передать URL-адрес. ws.handshake(host, "/"); это место, где вам нужно добавить URL-адрес вместо "/"