I had explained about how to start tracker server and how to create a meta data file.
In this section, I explain how to create seeder with libtorrent.
What is Seeder
Seeder is a peer uploading data. Seeder has many task.
- Regist own ip address and own status to tracker server
- Join the mainline dht network
- Explore peers which want to data
- Download and Upload Game
- Upload Data
etc..
But,You can write so easy a seeder code with using libtorrent
Source Code
It's a completed code is below.
//LD_LIBRARY_PATH=/usr/local/lib/libtorrent-rasterbar.so g++ main_tiny_seeder.cpp -o tiny_seeder.out -ltorrent-rasterbar -lpthread
#include <iostream>
#include <libtorrent/session.hpp>
#include <libtorrent/alert_types.hpp>
#include <libtorrent/alert.hpp>
std::string my_listen_interfaces = ""; //<your ip>:6881";//,[::]:6881" "{E4F0B674-0DFC-48BB-98A5-2AA730BDB6D6}:7777"
std::string target_torrentfile_path = "a.torrent"; // <your torrent file path>
std::string target_folder_path = ".data";
int main(int argc, char *argv[])
try
{
lt::session session();
lt::add_torrent_params torrent_params; // = lt::parse_magnet_uri("<your magnet link>");
torrent_params.save_path = ".data"; // save in current dir
torrent_params.ti = std::make_shared<lt::torrent_info>(target_torrentfile_path);
torrent_params.flags |= lt::torrent_flags::seed_mode; // May not be needed
torrent_params.have_pieces.set_all(); // May not be needed
torrent_params.verified_pieces.set_all(); // May not be needed
lt::torrent_handle h = session.add_torrent(std::move(torrent_params));
while (true)
{
std::vector<lt::alert *> alerts;
session.pop_alerts(&alerts);
lt::state_update_alert *st;
for (lt::alert *a : alerts)
{
std::cout << "[" << a->type() << "](" << a->what() << ") " << a->message() << std::endl;
}
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
END:
return 0;
}
catch (std::exception &e)
{
std::cerr << "Error: " << e.what() << std::endl;
}
It's so Simple Code.
Create Session
Session object manage all state about downloading and uploading and exploring
lt::session session();
Add Torrent to Session Object
Once the torrent file information is added to the session object, the session object will start uploading, downloading, and exploring.
lt::add_torrent_params torrent_params; // = lt::parse_magnet_uri("<your magnet link>");
torrent_params.save_path = ".data"; // save in current dir
torrent_params.ti = std::make_shared<lt::torrent_info>(target_torrentfile_path);
ssession.add_torrent(std::move(torrent_params));
Output Status
Session Object can notify alert any messages.
while (true)
{
std::vector<lt::alert *> alerts;
session.pop_alerts(&alerts);
lt::state_update_alert *st;
for (lt::alert *a : alerts)
{
std::cout << "[" << a->type() << "](" << a->what() << ") " << a->message() << std::endl;
} std::this_thread::sleep_for(std::chrono::milliseconds(1000));
}
Optional
If you has known ip address, you can set this
lt::settings_pack session_params;
session_params.set_int(lt::settings_pack::alert_mask, lt::alert_category::all);
if (my_listen_interfaces.length() != 0)
{
session_params.set_str(lt::settings_pack::listen_interfaces, my_listen_interfaces);
}
lt::session session(session_params);
and libtorrent has seeder mode.
lt::add_torrent_params torrent_params; // = lt::parse_magnet_uri("<your magnet link>");
torrent_params.save_path = ".data"; // save in current dir
torrent_params.ti = std::make_shared<lt::torrent_info>(target_torrentfile_path);
torrent_params.flags |= lt::torrent_flags::seed_mode; // May not be needed
torrent_params.have_pieces.set_all(); // May not be needed
torrent_params.verified_pieces.set_all(); // May not be needed
and has super seeder mode too.
All Source Code
https://github.com/kyorohiro/hello_libtorrent
app/main_tiny_seeder.cpp
Top comments (0)