• DHT. Как реализовать безтрекерный обмен файлами?

    @ivan386
    ID для узла выбирается уже не случайно https://www.bittorrent.org/beps/bep_0042.html
    Но если не предполагается анонса и приёма запросов то ID можно выбрать любой. Не все клиенты реализовали этот BEP.

    1. router.utorrent.com: 6881 - используется только для первичного получения списка узлов командой find_node. Она не требует info_hash а только id узла и target которые могут быть одинаковы так как мы ищем свою позицию в сети.

    В дальнейшем router.utorrent.com: 6881 не должен использоваться больше никак.

    2. routing table должен содержать значения для каждого узла: id, ip(v4 или v6), port, время последнего ответа.

    Её периодически нужно сохранять на диск и при следующем старте пытаться загрузиться уже с неё.

    3. Из таблицы выбираются ближайшие по id узлы к target или info_hash. И к ним соответственно отправляются find_node или get_peers.

    announce_peer возможен только после get_peers так как нужен токен для анонса который в ответе на get_peers.

    find_node используется для нахождения ближайших к своему id узлов. Также периодически можно искать случайные id для пополнения routing table.

    В какую таблицу мы складируем инфохэши от собственных и полученных файлов?


    Соответственно нужна отдельная таблица в которой по info_hash будет храниться список пиров.

    Запрос 'ping' делаем только в router.utorrent.com: 6881 или по всем нодам из routing table?


    Ни в коем случае. Работа с ним закончена на первом этапе.

    Ping нужно отсылать только на узлы из routing table с которыми длительное время не было связи. До тех пор пока узлы не ответят на ping их нельзя отдавать другим узлам на их запросы. Соответственно и узлы полученные от другого узла нельзя отдавать дальше до проверки их состояния.

    Другие узлы также будут проверять этот пингуя или опрашивая его.
    Ответ написан
    1 комментарий
  • Как запустить JS в браузере командой из windows приложения?

    Rou1997
    @Rou1997
    Во внешний браузер никак не передать, из соображений безопасности для этого не только нет API, но и есть защита от "трюков" таких как патчинг на диске и в памяти, один из главных факторов защиты это постоянные обновления браузеров, поэтому для них очень сложно писать какие-либо "трюки", это нужно чуть ли не дежурить 24/7, поэтому нет ничего такого.

    Вы вообще что хотите сделать?

    Если отвечать на ваш вопрос, то нужно написать расширение к браузеру которое уже выполняется не вне, а внутри него, использует его официальное API, затем останется только сделать "мост" между приложением и расширением, это может быть NPAPI/PPAPI-плагин либо нечто простое типа общего файла в localstorage, расширение его читает а приложение пишет туда команды.

    Но судя по комментариям, вам не это нужно, вам нужно написать бот для сайта, тогда внешний браузер это не то, вам надо либо использовать HTTP-запросы, либо браузер но не внешний а headless-браузер встроенный в приложение - Phantom.js, Selenium, Chromium Embedded Framework, WebKit, Awesomium, Selenium, IE WebBrowser.

    Если не получится, то можно отлавливать все запросы к исходному сайту windows приложением (как снифер) и проверять определённый параметр. Затем перехватывать и отвечать. Но это звучит очень сложно в реализации.

    Звучит сложно потому что вы не понимаете о чем говорите, если речь о написании бота то не нужно перехватывать запросы постоянно, достаточно сделать это один раз а затем просто отправлять их из своего приложения. Для разового перехвата запросов есть снифферы - Fiddler, Wireshark, Charles, консоль F12.
    Ответ написан
    4 комментария
  • Как запустить JS в браузере командой из windows приложения?

    GavriKos
    @GavriKos
    Приложение открывает себе локально какой то порт, на котором слушает HTTP-запросы.
    Джаваскриптина в странице постоянно дергает этот порт на предмет новых данных.
    Ответ написан
    4 комментария
  • Как преобразовать cli::array ^ в byte *??

    Используйте pin_ptr

    array<Byte>^ bytes = File::ReadAllBytes( fileName );
    pin_ptr<unsigned char> pptr = &bytes[0];
    const int BUFFER_SIZE = 65536;
    unsigned char buf [ BUFFER_SIZE ];
    memcpy_s( buf, sizeof(buf), pptr, bytes->Length );
    Ответ написан
  • Как преобразовать cli::array ^ в byte *??

    gbg
    @gbg Куратор тега C++
    Любые ответы на любые вопросы
    Уж если наворотили C++, используйте std::move.

    Вы пытаетесь отстрелить себе ногу.

    Когда в одном коде активно применяют сборщик мусора, и пытаются влепить низкоуровневую функцию из C, потому что где-то слышали, что это быстро, при этом размер держат в целочисленной переменной, мне становится грустно.

    Правильный учебник по написанию приложений TCP/IP называется "Эффективное использование TCP/IP" под авторством Й. Снейдера.
    Ответ написан
    1 комментарий
  • Как сделать Torrent streaming?

    Jump
    @Jump
    Системный администратор со стажем.
    Убрал первоначальный вариант ответ под спойлер
    spoiler
    У вас довольно неверное представление о торрентах вообще и о торрент стриминге в частности.
    Вот к примеру -
    Суть в том что у меня есть некий файл где-то в интернете на сервере.
    Сервер может прислать SHA1 этого файла для поиска по торрент трекерам (этого файла).

    Зачем искать файл по торрент трекерам? Какой в этом смысл?
    Поясню - возможны два варианта.
    a. Вы раздаете популярное видео, размещенное на популярном торрент трекере. В этом случае вам не нужно считать хэш и искать его где-то, достаточно просто скачать торрент файл с трекера.

    b. Вы раздаете нечто уникальное что есть только на вашем сервере- но тогда какой смысл искать его на других серверах если оно уникальное и его нигде нет?

    Теперь подробно пройдемся по вопросам:

    1)
    Как получить sha1 файла на компьютере, что бы он был такой же, как на торрент трекере. Пока они у меня почему-то разные.

    Чтобы получить точно такой же sha1 нужно применить алгоритм кодирования sha1 к точно такому же файлу.
    Т.е если sha1 хэши разные, значит файлы разные.

    2)
    Правильно ли я понимаю процесс скачивания торрент файла?

    Не знаю, я не телепат и не могу знать как вы понимаете процесс скачивания.

    3)
    Как можно подключится к торрент трекеру вручную, для отладки и наглядного понимания процесса получения файлов. Может через telnet какой...

    Если вы имеете ввиду подключение для управления трекером, то подключиться может администратор торрент трекера. Т.е если не являетесь администратором, то не подключитесь, а если являетесь то знаете как к нему подключится. К тому же это зависит от самого торрент трекера, они разные и управление у них разное.
    Если же речь про обычное подключение как пользователя - изучайте спецификацию протокола, пишите свой клиент, или отправляйте команды на трекер иным образом.
    Только не понятно какое это имеет отношение к скачиванию? С торрент трекера ничего не скачивается, кроме списка пиров.

    4)
    Как реализовать программно?

    Очень просто. Изучаете протокол, и создаете программу которая в соответствии с протоколом реализует то что вам нужно.
    Для стриминга кроме обычного функционала торрент клиента нужно будет реализовать приоритетное закачивание блоков для текущего воспроизведения. Т.е определять в проигрывателе какой именно кусок проигрывается, и запрашивать следующие за ним.

    После прочтения ваших комментариев к ответам я не вижу смысла обсуждать что-то не прояснив несколько принципиальных моментов.
    1)Торрент трекер не имеет никакого отношения к скачиванию файла по протоколу торрент. Вообще. И он никак не нужен для скачивания.
    2)По поводу хэша - непонятно какой хэш вы имеете ввиду.
    В протоколе torrent используется множество хэшей.
    Любой файл для передачи разбивается на множество мелких кусков. Для каждого куска считается свой хэш.
    Эти хэши нужны для скачивания и определения наличия куска у пира.
    Есть еще так называемый хэш торрента, по которому ищут торренты. Это хэш секции info.

    Т.е к примеру вы решили раздать фильм Аватар размером 10гб.
    Вы разбиваете его на тысячу кусков по 10мб и подсчитываете хэш для каждого куска.
    Количество получившихся кусков и все получившиеся хэши записываете в специальный torrent файл, добавляете туда название, и другую информацию о файле.
    Потом считаете хэш от этого торрент файла (заметьте не от фильма, а от его описания) и это будет торрент хэш по которому его можно искать.
    Причем заметьте - если кто то другой раздает точно такой же файл, то он может разбить его не на тысячу кусков, а на две тысячи, и назвать по другому, в результате получившийся хэш торрента будет совершенно другим. Хотя файлы в раздаче и абсолютно идентичны.
    Ответ написан
  • Нужна ли веб-программисту высшая математика?

    nazarpc
    @nazarpc
    Open Source enthusiast
    Нет, высшая не нужна. Обычная геометрия пригодится при работе с картами. А так в абсолютном большинстве школьного уровня более чем достаточно, главное чтобы логика хорошо работала.
    Ответ написан
    Комментировать
  • Нужна ли веб-программисту высшая математика?

    madmages
    @madmages
    Человек прямоходящий
    тут стоит определиться сначала кто такой веб программист: тот кто делает сайты или тот кто делает серверные программы(apache\nodejs\NGnix). Всю жизнь думал и думаю что веб программист это тот кто сайты клепает и вот такому вышка не особо нужна. Сам вощемто такой. В вузе не учился, образование 11 классов, самоучка, и стажа уже почти год. Знаний математики на уровне 0+52 = 52 хватает, но определенно ощущаю что чтобы начать делать серъезные веб приложения с постройкой графиков\стастистики и прочих радостях моих знаний не хватит. Вощем: хочешь делать сайты - школьной математики хватит
    Ответ написан
    3 комментария