| Crates.io | rbit |
| lib.rs | rbit |
| version | 0.2.2 |
| created_at | 2025-12-01 22:18:12.647222+00 |
| updated_at | 2025-12-03 21:08:35.885931+00 |
| description | A BitTorrent library implementing BEP specifications |
| homepage | |
| repository | https://github.com/jspwrd/rbit |
| max_upload_size | |
| id | 1960748 |
| size | 700,102 |
A comprehensive BitTorrent library implementing core BEP (BitTorrent Enhancement Proposals) specifications in pure Rust.
.torrent files and magnet linksbytes::Bytes for efficient buffer handlingparking_lot and dashmapAdd this to your Cargo.toml:
[dependencies]
rbit = "0.1"
use rbit::Metainfo;
let torrent_data = std::fs::read("example.torrent")?;
let metainfo = Metainfo::from_bytes(&torrent_data)?;
println!("Name: {}", metainfo.info.name);
println!("Info hash: {}", metainfo.info_hash);
println!("Total size: {} bytes", metainfo.info.total_length);
println!("Piece count: {}", metainfo.info.pieces.len());
for tracker in metainfo.trackers() {
println!("Tracker: {}", tracker);
}
use rbit::MagnetLink;
let magnet = MagnetLink::parse(
"magnet:?xt=urn:btih:c12fe1c06bba254a9dc9f519b335aa7c1367a88a&dn=Example"
)?;
println!("Info hash: {}", magnet.info_hash);
println!("Display name: {:?}", magnet.display_name);
use rbit::{PeerConnection, PeerId, Message};
use std::net::SocketAddr;
let peer_addr: SocketAddr = "192.168.1.100:6881".parse()?;
let info_hash = [0u8; 20]; // Your torrent's info hash
let our_peer_id = PeerId::generate();
let mut conn = PeerConnection::connect(
peer_addr,
info_hash,
*our_peer_id.as_bytes()
).await?;
// Express interest in downloading
conn.send(Message::Interested).await?;
// Wait for unchoke before requesting pieces
loop {
match conn.receive().await? {
Message::Unchoke => break,
Message::Bitfield(bits) => println!("Peer has {} bytes of bitfield", bits.len()),
_ => {}
}
}
use rbit::{HttpTracker, TrackerEvent};
let tracker = HttpTracker::new("http://tracker.example.com/announce")?;
let response = tracker.announce(
&[0u8; 20], // info_hash
&[0u8; 20], // peer_id
6881, // port
0, // uploaded
0, // downloaded
1000, // left
TrackerEvent::Started,
).await?;
println!("Found {} peers", response.peers.len());
println!("Re-announce in {} seconds", response.interval);
use rbit::DhtServer;
let dht = DhtServer::bind(6881).await?;
// Bootstrap from well-known nodes
dht.bootstrap().await?;
// Find peers for a specific info hash
let info_hash = [0u8; 20];
let peers = dht.get_peers(info_hash).await?;
for peer in peers {
println!("Found peer: {}", peer);
}
| BEP | Description | Module |
|---|---|---|
| BEP-3 | BitTorrent Protocol | peer, metainfo, tracker |
| BEP-5 | DHT Protocol | dht |
| BEP-6 | Fast Extension | peer |
| BEP-9 | Magnet Links | metainfo |
| BEP-10 | Extension Protocol | peer |
| BEP-11 | Peer Exchange (PEX) | pex |
| BEP-14 | Local Service Discovery | lsd |
| BEP-15 | UDP Tracker Protocol | tracker |
| BEP-23 | Compact Peer Lists | tracker |
| BEP-52 | BitTorrent v2 (partial) | metainfo |
This library provides low-level building blocks rather than a complete BitTorrent client. You are responsible for:
For a complete client implementation, combine these modules with your own orchestration logic.
This crate requires Rust 1.85 or later.
Licensed under either of
at your option.