Этот репозиторий содержит кроссплатформенную библиотеку C ++ Tubus, которая реализует протокол потокового транспорта на основе UDP . Протокол был первоначально разработан в рамках утилиты червоточины. Его можно использовать в тех случаях, когда использование TCP сложно, например, для приложений, работающих по NAT. Необязательно, чтобы повысить безопасность соединения, пакеты tubus могут быть запутаны предварительным ключом.
Для удобства разработки приложений, основанных на boost::asio , предлагаются Asio-подобные примитивы tubus::socket и tubus::acceptor . tubus::socket реализует Asyncreadstream , AsyncwriteStream boost::asio::ssl::stream Stream , Syncreadstream и SyncwriteStream
Tubus Channel Interface.
namespace tubus {
...
struct channel
{
virtual ~channel () noexcept ( true ) {}
virtual void close () noexcept ( true ) = 0;
virtual void open ( const endpoint& local) noexcept ( false ) = 0;
virtual void connect ( const endpoint& remote, const callback& handle) noexcept ( true ) = 0;
virtual void accept ( const endpoint& remote, const callback& handle) noexcept ( true ) = 0;
virtual void read ( const mutable_buffer& buffer, const io_callback& handle) noexcept ( true ) = 0;
virtual void write ( const const_buffer& buffer, const io_callback& handle) noexcept ( true ) = 0;
virtual void shutdown ( const callback& handle) noexcept ( true ) = 0;
virtual size_t writable () const noexcept ( true ) = 0;
virtual size_t readable () const noexcept ( true ) = 0;
virtual endpoint host () const noexcept ( false ) = 0;
virtual endpoint peer () const noexcept ( false ) = 0;
};
...
channel_ptr create_channel (boost::asio::io_context& io, uint64_t /* pre-shared key */ secret = 0 ) noexcept ( true );
} Потребитель данных реализован с использованием tubus::channel .
# include < tubus/channel.h >
...
auto consumer = tubus::create_channel(io_service, key);
consumer-> open (local_endpoint);
consumer-> connect (remote_endpoint, [&]( const boost::system::error_code& error)
{
...
tubus::mutable_buffer buffer (consumer-> readable ());
// if the buffer is empty, the callback will be called when all previously
// pended read operations are completed and more data can be read
consumer-> read (buffer, [&]( const boost:: system ::error_code& error, size_t size)
{
...
consumer-> shutdown ();
};
}); Производитель данных реализован с использованием tubus::socket .
# include < tubus/socket.h >
...
tubus::socket producer (io_service, key);
producer.open(local_endpoint);
producer.async_accept(remote_endpoint, [&]( const boost::system::error_code& error)
{
...
tubus::const_buffer buffer ( " hello, world! " );
producer. async_write_some (buffer, [&]( const boost:: system ::error_code& error, size_t size)
{
...
producer. shutdown ();
};
}); Сервер реализован с использованием tubus::acceptor (только Linux ).
# include < tubus/acceptor.h >
...
tubus::acceptor server (io_service, key);
server.open(local_endpoint);
tubus::socket peer1 (io_service);
server.accept(peer1);
peer1.read_some(...);
peer1.write_some(...);
tubus::socket peer2 (io_service);
server.accept(peer2);
peer2.read_some(...);
peer2.write_some(...);
peer1.shutdown();
peer2.shutdown();
server.close(); Зашифрованный поток реализован с использованием boost::asio::ssl::stream и tubus::socket .
# include < boost/asio/ssl.hpp >
# include < tubus/socket.h >
...
boost::asio::ssl::stream<tubus::socket> client (tubus::socket(io_service, key), ssl_ctx);
client.lowest_layer().open(local_endpoint);
client.lowest_layer().connect(remote_endpoint);
client.handshake(boost::asio::ssl::stream_base::client);
boost::asio::read (client, ...);
boost::asio::write (client, ...);
client.shutdown();Вы можете скачать Prebuild Packages для платформ Debian и Windows.
Библиотека зависит от boost . Для создания тестов требуется openssl .
cd ~
git clone https://github.com/novemus/tubus.git
cd ~/tubus
cmake -B ./build [-DBOOST_ROOT=...] [-DBUILD_TESTING=ON [-DOPENSSL_ROOT_DIR=...]]
cmake --build ./build --config Release --target tubus_shared tubus_static [tubus_ut]
cmake --build ./build --target install CMake импорта Cmake.
Сообщите об ошибках и предлагайте улучшения.
Tubus лицензирован в соответствии с Apache License 2.0, что означает, что вы можете получить его и использовать его для коммерческих и некоммерческих целей, если вы выполняете его условия. См. Файл License.txt для получения более подробной информации.
Copyright © 2023 Novemus Band. Все права защищены.