Libtorrent: Загрузка-соединение не может быть установлено, потому что целевая машина активно отказывается от него.

Я создал торрент-файл в виде небольшого текстового файла с параметрами. client.exe abc.txt -o abc.torrent -t http://MyIpv4:9090/ -l Код для создания торрента такой же, как в libtorrent-tutorial-make_torrent, а затем запустив клиент, я установил lt::settings_pack::broadcast_lsd в true, как показано ниже

void t_client_class::start_client(string torrent_file_name)
{
    lt::settings_pack sp;
    sp.set_bool(lt::settings_pack::broadcast_lsd, true);
    lt::session s(sp);

    lt::add_torrent_params p;
    p.save_path = "./";
    p.ti = std::make_shared<lt::torrent_info>(torrent_file_name);
    s.add_torrent(p);

}

Скачать торрент-код:

bool t_client_class::download_torrent(string magnet_uri)
{
    lt::settings_pack p;
    p.set_int(lt::settings_pack::alert_mask, lt::alert::status_notification
              | lt::alert::error_notification  );
    p.set_bool(lt::settings_pack::broadcast_lsd, true);
    lt::session ses(p);



    lt::add_torrent_params atp = lt::parse_magnet_uri(magnet_uri);
    atp.save_path = "."; // save in current dir
    lt::torrent_handle h = ses.add_torrent(std::move(atp));

    for (;;)
    {
        std::vector<lt::alert*> alerts;
        ses.pop_alerts(&alerts);

        for (lt::alert const* a : alerts)
        {
            std::cout << a->message() << std::endl;
            // if we receive the finished alert or an error, we're done
            if (lt::alert_cast<lt::torrent_finished_alert>(a))
            {
                goto done;
            }
            if (lt::alert_cast<lt::torrent_error_alert>(a))
            {
                goto done;
            }
        }
        std::this_thread::sleep_for(std::chrono::milliseconds(200));
    }
done:
    std::cout << "done, shutting down" << std::endl;
    return true;
}

Этот код работает для общедоступных торрентов. Я проверил это, загрузив файл из действительного торрент-файла с одного из торрент-сайтов.

В той же сети Wi-Fi на другом компьютере я пытаюсь загрузить этот торрент, передав URI магнита, как показано ниже.

magnet:?xt=urn:btih:<magnet_link_address>=abc.txt&tr=http%3a%2f%2f<IP_where_clinet_started>%3a9090%2f

Журнал для скачивания

successfully listening on [TCP] 0.0.0.0:6881
successfully listening on [UDP] 0.0.0.0:6881
successfully listening on [TCP] [current_device_mac]:6881
successfully listening on [UDP] [current_device_mac]:6881
successfully listening on [TCP] [current_device_mac_2]:6881
successfully listening on [UDP] [current_device_mac_2]:6881
added torrent: abc.txt
abc.txt: state changed to: dl metadata
abc.txt resumed
abc.txt (http://MyIpv4:9090/)[[current_device_mac]:6881] Unknown error "" (1)
abc.txt (http://MyIpv4:9090/)[[current_device_mac_2]:6881] Unknown error "" (1)
abc.txt (http://MyIpv4:9090/)[0.0.0.0:6881] No connection could be made because the target machine actively refused it "" (1)
abc.txt (http://MyIpv4:9090/)[[current_device_mac]:6881] Unknown error "" (2)
abc.txt (http://MyIpv4:9090/)[[current_device_mac_2]:6881] Unknown error "" (2)
abc.txt (http://MyIpv4:9090/)[0.0.0.0:6881] No connection could be made because the target machine actively refused it "" (2)

Из этого вопроса я узнал, что в локальной сети я могу необходимо включить опцию локального обнаружения одноранговых узлов и включить NAT-PMP/UPnP

Что я пробовал:

  • установить lt::settings_pack::broadcast_lsd на true
  • Включить сетевое обнаружение Windows в Панели управления -> Сеть и общий доступ -> Дополнительные параметры -> Общий доступ к общим папкам = Да
  • Полностью отключил брандмауэр на клиентской машине
  • добавлено входящее правило для TCP и UDP для порта 9090
  • Если создать торрент с udp вместо http: При запуске кода загрузки с другой машины я получаю An address incompatible with the requested protocol was used. Я не могу возиться с настройками маршрутизатора, так как у меня нет к нему доступа.

Я могу запустить 2 одноранговых узла в одной сети и отправлять сообщения о приеме без этой проблемы.

Есть ли способ преодолеть эту ошибку?


person Morse    schedule 29.07.2019    source источник


Ответы (1)


У меня не настроен трекер. Добавлен трекер с помощью opentracker и отключен брандмауэр, чтобы разрешить подключения. Это решило проблему.

person Morse    schedule 01.08.2019