66 int finished_torrents = 0;
69 FILE* log_file = std::fopen(
get_work_dir().append(
"bittorrent.log").c_str(),
"w+");
77 auto const handles =
ses.get_torrents();
78 for (
const auto& h : handles) {
79 h.save_resume_data(lt::torrent_handle::only_if_modified | lt::torrent_handle::save_info_dict);
85 std::vector<lt::alert*> alerts;
86 ses.pop_alerts(&alerts);
88 for (lt::alert
const* a : alerts) {
89 static auto const first_ts = a->timestamp();
95 static_cast<std::int64_t
>(duration_cast<std::chrono::milliseconds>(a->timestamp() - first_ts).count()),
96 a->message().c_str());
99 if (
auto at = lt::alert_cast<lt::add_torrent_alert>(a)) {
102 TLOG() <<
"debug : Added torrent " << at->torrent_name();
105 if (
auto p = lt::alert_cast<lt::torrent_removed_alert>(a)) {
106 lt::torrent_handle h = p->handle;
109 if (
auto p = lt::alert_cast<lt::torrent_paused_alert>(a)) {
110 lt::torrent_handle h = p->handle;
111 h.save_resume_data(lt::torrent_handle::save_info_dict);
114 if (
auto* p = lt::alert_cast<lt::tracker_list_alert>(a)) {
129 if (
auto p = lt::alert_cast<lt::torrent_finished_alert>(a)) {
130 TLOG() <<
"debug : Torrent finished " << p->torrent_name();
133 p->handle.save_resume_data(lt::torrent_handle::only_if_modified | lt::torrent_handle::save_info_dict);
143 if (
auto p = lt::alert_cast<lt::torrent_error_alert>(a)) {
151 p->handle.save_resume_data(lt::torrent_handle::only_if_modified | lt::torrent_handle::save_info_dict);
155 if (
const auto* rd = lt::alert_cast<lt::save_resume_data_alert>(a)) {
156 std::ofstream of(
get_work_dir().append(
".resume_file_" + rd->params.name), std::ios_base::binary);
157 of.unsetf(std::ios_base::skipws);
158 auto const b = write_resume_data_buf(rd->params);
159 of.write(b.data(),
static_cast<int>(b.size()));
165 if (
auto e = lt::alert_cast<lt::save_resume_data_failed_alert>(a)) {
172 if (lt::alert_cast<lt::peer_connect_alert>(a)) {
177 if (
auto e = lt::alert_cast<lt::peer_error_alert>(a)) {
192 if (
auto e = lt::alert_cast<lt::peer_disconnected_alert>(a)) {
206 if (
auto st = lt::alert_cast<lt::state_update_alert>(a)) {
208 if (st->status.empty()) {
212 for (uint64_t i = 0; i < st->status.size(); i++) {
213 lt::torrent_status
const& s = st->status[i];
218 case lt::torrent_status::checking_files:
221 case lt::torrent_status::downloading_metadata:
224 case lt::torrent_status::downloading:
227 case lt::torrent_status::finished:
230 case lt::torrent_status::seeding:
237 case lt::torrent_status::checking_resume_data:
252 TLOG() <<
"is_client " <<
m_is_client <<
" [" << i <<
"]" << s.name <<
" " <<
state(s.state) <<
' '
253 << (s.download_payload_rate / 1000) <<
" kB/s " << (s.total_done / 1000) <<
" kB ("
254 << (s.progress_ppm / 10000) <<
"%) " << s.current_tracker <<
" "
255 <<
static_cast<std::int64_t
>(duration_cast<seconds>(s.next_announce).count()) <<
"s (" << s.num_peers
256 <<
" peers) " <<
"\n";
356 std::this_thread::sleep_for(std::chrono::milliseconds(200));
360 ses.post_torrent_updates();
361 ses.post_session_stats();
376 std::filesystem::remove(
get_work_dir().append(k +
".torrent"));
379 s->set_error_code(
"Transfer interrupted");
383 TLOG() <<
"\nBittorent session done, shutting down";
385 std::fclose(log_file);
388}
catch (std::exception& e) {
390 std::cerr <<
"Error: " << e.what() << std::endl;
518 lt::session_params sp;
519 auto& p = sp.settings;
521 sp.disk_io_constructor = lt::default_disk_io_constructor;
523 int block_size = 1024 * 1024;
524 std::string outgoing_interface = listen_interface.
get_ip();
525 std::string listen_interfaces = listen_interface.
get_ip() +
":" + listen_port;
527 p.set_bool(lt::settings_pack::enable_dht,
false);
528 p.set_int(lt::settings_pack::auto_manage_interval, 60);
529 p.set_int(lt::settings_pack::auto_manage_startup, 1);
530 p.set_int(lt::settings_pack::min_reconnect_time, 1);
531 p.set_int(lt::settings_pack::max_failcount, 10);
539 p.set_str(lt::settings_pack::outgoing_interfaces, outgoing_interface);
540 p.set_bool(lt::settings_pack::strict_end_game_mode,
false);
542 p.set_bool(lt::settings_pack::smooth_connects,
false);
543 p.set_bool(lt::settings_pack::allow_multiple_connections_per_ip,
true);
544 p.set_bool(lt::settings_pack::announce_to_all_tiers,
true);
545 p.set_bool(lt::settings_pack::announce_to_all_trackers,
true);
546 p.set_bool(lt::settings_pack::auto_sequential,
true);
550 p.set_bool(lt::settings_pack::incoming_starts_queued_torrents,
true);
552 p.set_bool(lt::settings_pack::enable_incoming_tcp,
true);
553 p.set_bool(lt::settings_pack::enable_outgoing_tcp,
true);
554 p.set_bool(lt::settings_pack::enable_incoming_utp,
false);
555 p.set_bool(lt::settings_pack::enable_outgoing_utp,
false);
556 p.set_bool(lt::settings_pack::enable_lsd,
false);
557 p.set_bool(lt::settings_pack::enable_natpmp,
false);
558 p.set_bool(lt::settings_pack::enable_upnp,
false);
559 p.set_bool(lt::settings_pack::prefer_rc4,
false);
560 p.set_bool(lt::settings_pack::prefer_udp_trackers,
true);
561 p.set_bool(lt::settings_pack::rate_limit_ip_overhead,
false);
564 p.set_int(lt::settings_pack::aio_threads, 1);
566 p.set_int(lt::settings_pack::hashing_threads, 1);
567 p.set_int(lt::settings_pack::disk_io_read_mode, 3);
568 p.set_int(lt::settings_pack::disk_io_write_mode, 3);
569 p.set_int(lt::settings_pack::allowed_enc_level, 3);
570 p.set_int(lt::settings_pack::allowed_fast_set_size, 5);
571 p.set_int(lt::settings_pack::seed_choking_algorithm, 1);
572 p.set_int(lt::settings_pack::choking_algorithm, 0);
573 p.set_int(lt::settings_pack::in_enc_policy, 2);
574 p.set_int(lt::settings_pack::out_enc_policy, 2);
575 p.set_int(lt::settings_pack::mixed_mode_algorithm, 0);
576 p.set_int(lt::settings_pack::suggest_mode, 0);
578 p.set_int(lt::settings_pack::close_file_interval, 0);
579 p.set_int(lt::settings_pack::inactivity_timeout, 10);
580 p.set_int(lt::settings_pack::request_queue_time, 50);
581 p.set_int(lt::settings_pack::peer_timeout, 20);
582 p.set_int(lt::settings_pack::request_timeout, 10);
583 p.set_int(lt::settings_pack::predictive_piece_announce, 20);
584 p.set_int(lt::settings_pack::whole_pieces_threshold, 20);
585 p.set_int(lt::settings_pack::mmap_file_size_cutoff, 0);
588 p.set_int(lt::settings_pack::upload_rate_limit, 0);
589 p.set_int(lt::settings_pack::download_rate_limit, 0);
592 p.set_int(lt::settings_pack::unchoke_slots_limit, -1);
593 p.set_int(lt::settings_pack::max_failcount, 3);
594 p.set_int(lt::settings_pack::max_http_recv_buffer_size, 1024 * 1024 * 8);
595 p.set_int(lt::settings_pack::max_rejects, 20);
596 p.set_int(lt::settings_pack::max_queued_disk_bytes, 1024 * 1024 * 1024);
598 p.set_int(lt::settings_pack::read_cache_line_size, 512);
601 p.set_int(lt::settings_pack::cache_size_volatile, 128);
602 p.set_int(lt::settings_pack::checking_mem_usage, 1024);
606 p.set_bool(lt::settings_pack::use_parole_mode,
false);
609 p.set_int(lt::settings_pack::tracker_completion_timeout, 30);
610 p.set_int(lt::settings_pack::tracker_receive_timeout, 30);
611 p.set_int(lt::settings_pack::stop_tracker_timeout, 30);
612 p.set_int(lt::settings_pack::tracker_backoff, 250);
613 p.set_int(lt::settings_pack::tracker_maximum_response_length, 1024 * 1024 * 8);
614 p.set_bool(lt::settings_pack::validate_https_trackers,
false);
615 p.set_int(lt::settings_pack::alert_mask, lt::alert_category::all);
617 p.set_str(lt::settings_pack::listen_interfaces, listen_interfaces);
621 p.set_bool(lt::settings_pack::piece_extent_affinity,
true);
622 p.set_bool(lt::settings_pack::seeding_outgoing_connections,
false);
624 p.set_int(lt::settings_pack::tick_interval, 500);
625 p.set_int(lt::settings_pack::torrent_connect_boost, 255);
627 p.set_int(lt::settings_pack::connection_speed, 0);
628 p.set_int(lt::settings_pack::active_seeds, 0);
629 p.set_int(lt::settings_pack::active_downloads, 10);
630 p.set_int(lt::settings_pack::active_checking, 10);
631 p.set_int(lt::settings_pack::active_limit, 10);
632 p.set_int(lt::settings_pack::active_tracker_limit, 10);
633 p.set_int(lt::settings_pack::connections_limit, 10);
635 p.set_int(lt::settings_pack::file_pool_size, 10);
636 p.set_int(lt::settings_pack::listen_queue_size, 10);
637 p.set_int(lt::settings_pack::max_allowed_in_request_queue, 50000);
638 p.set_int(lt::settings_pack::max_out_request_queue, 50000);
639 p.set_int(lt::settings_pack::dht_upload_rate_limit, block_size * 10);
641 p.set_int(lt::settings_pack::write_cache_line_size, 512);
646 p.set_int(lt::settings_pack::send_buffer_watermark_factor, 50);
647 p.set_int(lt::settings_pack::send_buffer_low_watermark, 1024 * 10);
648 p.set_int(lt::settings_pack::send_buffer_watermark, 1024 * 500);
649 p.set_int(lt::settings_pack::send_socket_buffer_size, 1024 * 512);
650 p.set_int(lt::settings_pack::recv_socket_buffer_size, 1024 * 1024 * 1024);
652 p.set_bool(lt::settings_pack::no_atime_storage,
true);
653 p.set_bool(lt::settings_pack::enable_set_file_valid_data,
false);
654 p.set_int(lt::settings_pack::disk_write_mode, 1);
655 p.set_bool(lt::settings_pack::disable_hash_checks,
false);
659 p.set_bool(lt::settings_pack::piece_extent_affinity,
false);
660 p.set_bool(lt::settings_pack::seeding_outgoing_connections,
true);
662 p.set_int(lt::settings_pack::tick_interval, 150);
663 p.set_int(lt::settings_pack::torrent_connect_boost, 255);
665 p.set_int(lt::settings_pack::connection_speed, 200);
666 p.set_int(lt::settings_pack::active_seeds, 1000);
667 p.set_int(lt::settings_pack::active_downloads, 0);
668 p.set_int(lt::settings_pack::active_checking, 1000);
669 p.set_int(lt::settings_pack::active_limit, 2000);
670 p.set_int(lt::settings_pack::active_tracker_limit, 2000);
671 p.set_int(lt::settings_pack::connections_limit, 8000);
673 p.set_int(lt::settings_pack::file_pool_size, 20);
674 p.set_int(lt::settings_pack::listen_queue_size, 3000);
675 p.set_int(lt::settings_pack::max_allowed_in_request_queue, 2000);
676 p.set_int(lt::settings_pack::max_out_request_queue, 2000);
677 p.set_int(lt::settings_pack::dht_upload_rate_limit, block_size * 8);
679 p.set_int(lt::settings_pack::write_cache_line_size, 128);
684 p.set_int(lt::settings_pack::send_buffer_watermark_factor, 150);
685 p.set_int(lt::settings_pack::send_buffer_low_watermark, 1024 * 10);
686 p.set_int(lt::settings_pack::send_buffer_watermark, 1024 * 1024 * 1024);
687 p.set_int(lt::settings_pack::send_socket_buffer_size, 1024 * 1024 * 1024);
688 p.set_int(lt::settings_pack::recv_socket_buffer_size, 1024 * 512);