Developer SDK

C++ examples

Install the SDK · View source on GitHub ↗

socket/main.cpp

#include "ur_stream.hpp"
#include <boost/beast/core.hpp>
#include <boost/beast/http.hpp>
#include <iostream>

struct Session {
    ur_session value{};
    Session() {if (ur_session_open(&value)) throw std::runtime_error("Device setup failed");}
    ~Session() {ur_session_close(&value);}
};
int main(int argc, char** argv) {
    try {
        std::string mode = argc > 1 ? argv[1] : "beast";
        if (mode == "--version" || mode == "--new-id") {
            auto s = mode == "--version" ? urnet_version() : urnet_new_id();
            std::cout << s << '\n'; urnet_free_string(s); return 0;
        }
        Session session;
        if (mode == "beast") {
            std::string authority = argc > 2 ? argv[2] : "example.com:443";
            UrStream stream(session.value.device, authority);
            namespace http = boost::beast::http;
            http::request<http::empty_body> request{http::verb::get, argc > 3 ? argv[3] : "/", 11};
            request.set(http::field::host, authority);
            request.set(http::field::connection, "close");
            http::write(stream, request);
            boost::beast::flat_buffer buffer;
            http::response_parser<http::string_body> parser;
            parser.body_limit(1 << 20);
            http::read(stream, buffer, parser);
            std::cout << parser.get() << '\n';
        } else if (mode == "udp" || mode == "dtls") {
            if (argc < 3) throw std::runtime_error("Provide an echo server host:port");
            char *error = nullptr;
            auto conn = mode == "udp" ? urnet_device_dial(session.value.device, "udp", argv[2], 30000, &error)
                : urnet_device_dial_tls(session.value.device, "udp", argv[2], 30000, "{}", &error);
            if (ur_error(error) || !conn) return 1;
            struct Release {uint64_t h; ~Release(){urnet_release(h);}} release{conn};
            urnet_conn_set_deadline(conn, ur_now_millis() + 10000, &error); if (ur_error(error)) return 1;
            urnet_conn_write(conn, reinterpret_cast<const uint8_t*>("hello"), 5, &error); if (ur_error(error)) return 1;
            uint8_t bytes[65535]; bool eof = false;
            auto n = urnet_conn_read(conn, bytes, sizeof(bytes), &eof, &error);
            if (n > 0) std::cout.write(reinterpret_cast<char*>(bytes), n);
            if (ur_error(error)) return 1;
            std::cout << "\nEOF: " << eof << '\n';
        } else throw std::runtime_error("Modes: beast, udp, dtls");
    } catch (const std::exception& e) {std::cerr << e.what() << '\n'; return 1;}
}