Ce référentiel contient la bibliothèque de tubus C ++ multiplateforme, qui implémente un protocole de transport de streaming basé sur UDP . Le protocole a été initialement développé dans le cadre de l'utilitaire de trou de ver. Il peut être utilisé dans les cas où l'utilisation de TCP est difficile, par exemple, pour les applications exécutées sur NAT. Facultativement, pour augmenter la sécurité des connexions, les paquets tubus peuvent être obscurcis par une clé pré-partagée.
Pour la commodité de développer des applications basées sur boost::asio , les primitifs de type Asio tubus::socket et tubus::acceptor sont offerts. Le tubus::socket Primitive implémente AsyncreadStream , AsyncWriteStream , Stream , SyncreadStream et SyncWriteStream , afin qu'il puisse être utilisé comme couche inférieure de boost::asio::ssl::stream .
Interface tubus-anhannel.
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 );
} Le consommateur de données implémenté à l'aide de 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 ();
};
}); Producteur de données implémenté à l'aide de 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 ();
};
}); Serveur implémenté à l'aide de tubus::acceptor ( Linux uniquement).
# 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(); Stream chiffré implémenté à l'aide de boost::asio::ssl::stream et 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();Vous pouvez télécharger des packages PreBuild pour les plateformes Debian et Windows.
La bibliothèque dépend du boost . Pour construire des tests, l' openssl est requis.
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 Variables d'importation CMake .
Signaler les bogues et suggérer des améliorations.
Tubus est autorisé sous la licence Apache 2.0, ce qui signifie que vous êtes libre de l'obtenir et de l'utiliser à des fins commerciales et non commerciales tant que vous remplissez ses conditions. Voir le fichier licence.txt pour plus de détails.
Copyright © 2023 Novemus Band. Tous droits réservés.