Este repositorio contiene la biblioteca C ++ Tubus de plataforma cruzada, que implementa un protocolo de transporte de transmisión basado en UDP . El protocolo se desarrolló originalmente como parte de la utilidad del agujero de gusano. Se puede usar en los casos en que el uso de TCP es difícil, por ejemplo, para aplicaciones que se ejecutan sobre NAT. Opcionalmente, para aumentar la seguridad de la conexión, los paquetes tubus pueden ser ofuscados por una llave previa al intercambio.
Para la conveniencia de desarrollar aplicaciones basadas en boost::asio , se ofrecen las primitivas de ASIO tubus::socket y tubus::acceptor . El tubus::socket Primitive implementa los conceptos de AsynCreadStream , AsynCWriteStream , Stream , SynCreadStream y SyncWriteSteam , por lo que puede usarse como la capa inferior de boost::asio::ssl::stream .
Tubus interfaz с einal.
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 );
} El consumidor de datos implementado con 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 ();
};
}); Productor de datos implementado con 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 ();
};
}); Servidor implementado usando tubus::acceptor (solo 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(); Stream cifrado implementado usando boost::asio::ssl::stream y 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();Puede descargar paquetes PreBuild para plataformas Debian y Windows.
La biblioteca depende del boost . Para construir pruebas, se requiere el 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 Variables de importación CMake .
Informe errores y sugiera mejoras.
Tubus tiene licencia bajo la licencia APACHE 2.0, lo que significa que es libre de obtenerlo y usarlo para fines comerciales y no comerciales siempre que cumpla con sus condiciones. Consulte el archivo License.txt para obtener más detalles.
Copyright © 2023 Novemus Band. Reservados todos los derechos.