Кто-нибудь занимался?.
Не могу понять один момент:
Пример из документации аплоада файла:
Client <-> Client Communication in DC. 11-05-2002. By aDe
----------------------------------------------------------
ACTIVE FILE DOWNLOAD
----------------------
D = downloader
U = uploader
H = hub
D>H: $ConnectToMe <U's username> <D's IP and port>|
H>U: $ConnectToMe <U's username> <D's IP and port>|
U>D: Connection
U>D: $MyNick <U's nick>|$Lock <new lock with pk>|
D>U: $MyNick <D's nick>|$Lock <new lock with pk>|$Direction Upload <anumber>|$Key <key for U's lock>|
U>D: $Direction Download <anumber>|$Key <key for D's lock>|
D>U: $Get <filepath + filename in exact case>$<start at byte (1=beginning of file)>|
U>D: $FileLength <length of the requested file>|
D>U: $Send|
U>D: Data, in many chunks.
D>U: $Send| <- when 40906 bytes are sent, ask for more
У меня получается:
$ConnectToMe botnick 92.125.195.196:31333
Creating Upload Connection to addr 92.125.195.196:31333
92.125.195.196
Localhost connection
#>>>>> HERE <<<<<<#
>>$MyNick botnick|$Lock EXTENDEDPROTOCOLABCABCABCABCABCABC pk=1024|
<<$MyNick n0uk|$Lock EXTENDEDPROTOCOLABCABCABCABCABCABC Pk=DCPLUSPLUS0.698ABCABC|$Supports MiniSlots XmlBZList ADCGet TTHL TTHF GetZBlock ZLIG |$Direction Download 6172|$Key ����A ѱ���0�0 0 0 0 0 0|
DLOCK IS: (EXTENDEDPROTOCOLABCABCABCABCABCABC)
>>$Direction Download 6172|$Key ����A ѱ���0�0 0 0 0 0 0|
<<
Вот в этом месте -- клиент перестает отвечать, когда исходя из документации должен сказать "$Get блаблабла"
(>>) - отправляю я
(<<) - приходит мне
Что я упустил?
Не уверен, что тут быстро ответят спецы по DC, т.ч. не побрезгуй мнением прохожего :)
Не понятно, что именно ты хочешь - upload или download? На словах ты пишешь про аплоад, а мануал привёл для active download. Не знаком с DC, но здравый смысл подсказывает, что это разные операции - в одном случае U связывается с D и отправляет файл, в другом - D связывается с U и скачивает файл с него. Инициатор операции разный, и именно инициатор знает, что собственно надо.
Связанный с этим вопрос - откуда вообще при аплоаде D может узнать имя файла, который ты хотел ему передать?
>Не уверен, что тут быстро ответят спецы по DC, т.ч. не побрезгуй мнением прохожего :)
Не понятно, что именно ты хочешь - upload или download? На словах ты пишешь про аплоад, а мануал привёл для active download. Не знаком с DC, но здравый смысл подсказывает, что это разные операции - в одном случае U связывается с D и отправляет файл, в другом - D связывается с U и скачивает файл с него. Инициатор операции разный, и именно инициатор знает, что собственно надо.
Связанный с этим вопрос - откуда вообще при аплоаде D может узнать имя файла, который ты хотел ему передать?
---------
Я из linuxdcpp (n0uk) пытаюсь скачать у программы (botnick) файл-лист.
То есть,в linuxdcpp жму кнопку, скачать файллист у botnick, и linuxdcpp шлет мне через хаб свой ip:port в команде $ConnectToMe.
Я (программа botnick) соединяюсь к нему, шлю ему $MyNick|$Lock. Он отвечает мне ключем, локом, и $Direction. После этого мои ответы он не воспринимает правильно, и после ответа с ключем на его лок, и дирекшеном Upload, он дисконнектится (linuxdcpp).
Тысяча чертей.(с). А я так понял, что я ему его должен вернуть.
Спасибо, сейчас проверю.
Не могли бы вы сразу сказать, откуда эта строчка?. Документации по протоколу почти ноль нашел.
Ключ -- правильный, я сделал такой же лок, и шлю ему его же ключ, ибо думал проблема в этом.
>А что такое дисишное пишете?
Пока либу дисишную на пайтоне.
А про схему -- там или она через не здравый смысл, или я не понял.
В смысле, если у меня кто-то хочет что-то скачать, я должен с ним соединиться и он мне скажет что ему нужно, я ему отдам.
D -- может узнать имя файла на моем пк, после операции поиска, или если скачает у меня MyList.dclst и посмотрит в нем все возможные файлы.
Теперь понял, что хочешь сказать. D хочет скачать у U файл. Устанавливает соединение, здоровается, но почему-то запрос get так и не подаёт. Так что со здравым смыслом больше проблем не вижу, настораживает только то, что оба ключа почему-то оказались равны, хотя в приведённом примере документации эти ключи даже называются по-разному. Может, второй ключ сгенерировать случайно?
На первый взгляд, действительно, оба клиента хотят скачивать (везде $Download) и если числа разные, то оба дисконнектятся.
Во-вторых, нужно ещё отправлять $Supports, если у обоих клиентов в $Lock написано EXTENDEDPROTOCOL.
Одно время я писал либу на C для Direct Connect. Но абсолютная убогость протокола в конце-концов меня взбесила и я на это дело забил. В принципе, код находится вот тут: http://tools.assembla.com/dcengine/wiki
Если он вам как-то поможет, то буду только рад. Вам, скорее всего, нужен файл /lib/dcengine_user.c Помнится, там файлы скачивались, хотя абсолютно уверен быть не могу. Да и вообще, я уже плохо помню, в каком состоянии там всё находится. И более заниматься этим не собираюсь. :)
По поводу документации... На сайту DC++ раньше было неплохое вики с описанием протокола. Только сайт заддосили и его вырубили. В принципе, если стукнуться на оффициальный хаб и попросить доступ к вики (ну или дамп), то могут помочь. Мне помогли.
>В принципе, если стукнуться на оффициальный хаб и попросить доступ к вики (ну или дамп), то могут помочь. Мне помогли.
Нашел только контакт некоего Todd Pederzani, он сказал что выключил машину с локальной копией вики на целое лето (ибо тепло и шумно) и навряд ли включит когда-нибудь, т.к. бросает это дело.
Эх. Придется ковыряться в логах тисипидампа и чужих сорцах.