MyDC.ru _ Технические вопросы по PtokaX _ Анализ ответа от PtokaX
Автор: Sergey2009 23.2.2010, 0:45
Здравствуйте, пишу программу под C#, цель - это получить данные от хаба (в частности количество юзеров, размер шары). Для этого поставил PtokaX - чисто для анализа команд посылаемых моей программой. В программе создаю объект сокета и подсоединяюсь по протоколу (TCP/UDP) к указаному мною IP и порту, после посылки любой команды в окне администратора PtokaX выплывает такое: [00:02] x User removed: <unknown> (Socket 536). Я подозреваю, что необходимо предварительно "представиться" cерверу, но все попытки не успешны. Подскажите, чем подобные ответы сервера могут быть вызваны?
Точнее даже при обычном коннекте в админке PtockaX выдает [00:41] x User removed: <unknown> (Socket 524)
Автор: Setuper 23.2.2010, 1:02
Изучай протокол: http://mydc.ru/topic915.html
Автор: Sergey2009 23.2.2010, 1:05
У меня есть этот топик, запросы подобно этому: $Lock EXTENDEDPROTOCOL[некий_ключ_хаба] Pk=PtokaX не воспринимаются
Cпасибо, я связался с человеком, может подскажет...
Автор: dmvn 23.2.2010, 12:35
Цитата(Sergey2009 @ 23.2.2010, 12:13)
Cпасибо, я связался с человеком, может подскажет...
Помнится, я тоже сталкивался с этим. Как отлаживал - уже точно не помню, единственное что помню - так это то, что вставлял отладочную печать в код самого PtokaX (в nix-версию). где-то тут на форуме были исходники маленькой проги HubLink для линковки хабов, которую я когда-то делал. Сравните вашу процедуру соединения и то что написано там. Может быть мне удастся вспомнить, где там были грабли...
Но вообще когда он пишет User removed - это значит что он не получил нужного ответа (AFAIK). А вот что конкретно ему не понравилось - без отладки мне тогда понять не удалось. А дырявая башка уже всё забыла Если у меня сохранился отладочный код - выложу...
Автор: Sergey2009 23.2.2010, 12:45
2 dmvn
Здравствуйте, ХабЛин программку глянул (она правда на С++), в моем конкретном случае, я создаю объект СОКЕТ. И конечную точку (Ip:Port). Протокол для соединения либо TCP, либо UDP...дак вот, к моему локальному хабу коннектится, но через некоторое время (команды я никакие не отсылаю), в птоке пишет [12:40] x User removed: <unknown> (Socket 536), а в Админке: Accepted Connectio - прибавляется 1, ну т.е. Соединение идет, а через некоторое время выкидывает меня (Сlosed Connection - прибавляется 1). Я подозреваю, что нужно в этот момент получить/отправить данные (т.е. в момент данного промежутка соединения)
В том-то и вопрос, как реагирует ПТОха на мою попытку? Если при соединеии он запрашивает данные Мол Кто я такой? Или же ему само соединение (в частности используемый протокол (TCP/UDP)) не нравится
Автор: Setuper 23.2.2010, 12:56
В протоколе же чётко описаны все шаги входа на хаб. Нужно только внимательно прочитать.
Мы соединяемся с хабом (не отсылаем при соединении ничего, а ждём ответа от хаба).
Хаб принимает наше соединение и отсылает нам команду $Lock.
Мы должны отослать в ответ команду $Key и команду $ValidateNick.
Хаб отправит нам команды $HubName и $Hello
Мы должны отправить команды $Version, $GetNickList и $MyINFO
Хаб отправит нам список пользователей.
Всё, мы вошли на хаб.
Кроме всего прочего, для того чтобы находится на хабе нам нужно время от времени отсылать на хаб команду пинга (пустую команду - команду, состоящую только из одного разделителя протокола | ).
Автор: Sergey2009 23.2.2010, 13:03
Цитата(Setuper @ 23.2.2010, 14:56)
В протоколе же чётко описаны все шаги входа на хаб. Нужно только внимательно прочитать.
Мы соединяемся с хабом (не отсылаем при соединении ничего, а ждём ответа от хаба).
Хаб принимает наше соединение и отсылает нам команду $Lock.
Мы должны отослать в ответ команду $Key и команду $ValidateNick.
Хаб отправит нам команды $HubName и $Hello
Мы должны отправить команды $Version, $GetNickList и $MyINFO
Хаб отправит нам список пользователей.
Всё, мы вошли на хаб.
Кроме всего прочего, для того чтобы находится на хабе нам нужно время от времени отсылать на хаб команду пинга (пустую команду - команду, состоящую только из одного разделителя протокола | ).
1. Мы соединяемся с хабом (не отсылаем при соединении ничего, а ждём ответа от хаба).
Ну как бы соединение не получается, закрывает он мою попытку. Попытка рубится не сразу, а через некоторое время...и как я вижу по потоку, он (Хаб) ничего мне не отсылает. Может есть программы, что-то типа снифера, чтобы глянуть пакеты идущие от хаба мне?
Автор: Setuper 23.2.2010, 13:15
Ну раз не получается соединиться, то смотри причину в ошибке сокета. Я так понимаю используется winsock? Соединение нужно устанавливать исключительно по протоколу TCP, никаких UDP!
Цитата
и как я вижу по потоку, он (Хаб) ничего мне не отсылает.
по какому ещё потоку? Лови то что тебе прислал хаб функцией recv.
Автор: Sergey2009 23.2.2010, 13:29
Объект (С#): Socket Sock = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Тут впринципе все понятно, endpoint - cоздает конечную точку вида Ip:Protocol
Похоже подцепил ответ от хаба:
"$Lock EXTENDEDPROTOCOLe=nHlsuM`EX[SVsG2tbw1TXlcxAwin Pk=PtokaX|" Это и есть ключ, теперь его нужно обратно отослать :-)...так
Цитата(Sergey2009 @ 23.2.2010, 15:28)
Объект (С#): Socket Sock = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); Тут впринципе все понятно, endpoint - cоздает конечную точку вида Ip:Protocol
Похоже подцепил ответ от хаба:
"$Lock EXTENDEDPROTOCOLe=nHlsuM`EX[SVsG2tbw1TXlcxAwin Pk=PtokaX|" Это и есть ключ, теперь его нужно обратно отослать :-)...так
Класс сокет, он создает свой поток
Автор: Setuper 23.2.2010, 13:32
Ну вот. Хаб тебе отсылал, а ты просто видимо не ловил то, что он тебе отсылал. Хаб отсылает тебе $Lock и ждёт от тебя $Key, а ты молчишь, поэтому хаб закрывает с тобой соединение через некоторое время ожидания.
Автор: Sergey2009 23.2.2010, 13:40
Видите в чем дело, я ловил конструкцией :
byte[] remdata = { }; Sock.Receive(remdata);
Сокет - это Объект класса...и поидее он должен был подцепить данные от хаба. Хотя не ловил. Оказывается, необходимо действовать по такому: http://mydc.ru/r/?http://krez0n.org.ua/archives/41
Кстати ответ от хаба идет в кодировки ASCII, хотя в документации к протоколу ADC написано : The protocol requires that all text must be sent as UTF-8 encoded Unicode, normalized in form C.
Я немного не понимаю, как свзяан TCP и ADC ?
Автор: Setuper 23.2.2010, 13:49
А при чём тут вообще ADC? Хаб PtokaX работает на NMDC протоколе. Это разные протоколы. А TCP - это сетевой протокол, который нужен для передачи данных по сети. А уже эти данные содержат в себе NMDC протокол.
Вообще, как так можно что-то писать, не разобравшись даже для чего нужен TCP протокол?))))
Автор: Sergey2009 23.2.2010, 15:14
>>PtokaX работает на NMDC.
Ок, понял :-) Cпасибо за помощь, вы сюда загляните еще попозже:-)
[15:18] <unknown> (ip) > $Key ?raUyUbfx3dl@ye0YSvAGtK]ncDwin| [15:18] x User removed: <unknown> (Socket 444)
Однако, если посмотреть "обычное" рукопожатие внешнего клиента и хаба, то ключ (он конечно же другой) выглядит так:
$Key tСА° A С±±АА0rCЃ'Ђ·бv–ЕГуSв0BCҐ·/%DCN096%/’‘сW·бp|
Кодировка как я понимаю не ASCII и что за последовательность tСА° - ? она постоянно присутсвует в ключе других юзеров
Автор: Nickolya 23.2.2010, 15:35
Скорее всего такая последовательность есть всегда ввиду того что строка Lock содержит в себе всегда в начале EXTENDEDPROTOCOL Алгоритм создания ключа можешь найти в описании протокола на этом форуме. Еще я знаю что хабы порой не проверяют ответ клиента, но это лишь слухи
Автор: Setuper 23.2.2010, 15:43
Ключ нужно рассчитывать по параметру команды $Lock, а не тупо отправлять параметр команды $Lock! Алгоритм расчёта ключа опять же смотри в протоколе: http://mydc.ru/ipb.html?act=findpost&pid=19477
Кроме этого, вместе с ключом нужно сразу же отослать и команду $ValidateNick.
Спасибо, но мне нужно всего лишь кодировку в которой необходимо пересылать этот ключ обратно ПтоКе. Ведь принятая команда $Lock - уже содержит зашифрованную последовательность (tСА° < ключ> бp|). Я это к тому, что в моем ответе ПтоКе содержится на конце win|, и ключ отсылается в кодировке ACSII, а внешние клиенты шлют ключ как-то иначе
Автор: Setuper 23.2.2010, 15:52
Команда $Lock не содержит ключа. Она содержит лишь код, по которому нужно по известному алгоритму определить ключ.
Код
$Lock [код]| $Key lock2key([код])|
где lock2key - это функция (алгоритм), которая преобразует код команды lock в ключ
Автор: Sergey2009 23.2.2010, 16:08
А сам алгоритм lock2key есть, а то я давно С++ не пользовал.
Автор: Setuper 23.2.2010, 16:22
http://mydc.ru/topic2989.html
Автор: Sergey2009 23.2.2010, 16:26
Точно :-) Спасибо Вам, с наступающим (вшим) Праздником.
Ну если будут еще вопросы к вам....то уж пожалуйста стерпите :-)
Только не забудь добавить функцию DCN экранирования (см. последний пост указанной темы).
Автор: Sergey2009 24.2.2010, 2:35
>>Только не забудь добавить функцию DCN экранирования (см. последний пост указанной темы).
Функцию наlock2key С# (данную в топике) дополнил, но все таки что-то не то...Такого шаблона не получается:($Key tСА ° < ключ> бp|). Символы начала и конца последовательности tСА ° и бp| у меня не присутствуют и я даже не могу понять что это за дополнения. Мне кажется. я что-то не то передаю в функцию lock2key. Какой именно код нужно "шифровать", я так полагаю что код в последовательности вида $Lock EXTENDEDPROTOCOLCVJYYYNNgSg:9J9ubJcBg4KKNhFwin Pk=PtokaX| , такой EXTENDEDPROTOCOLCVJYYYNNgSg:9J9ubJcBg4KKNhFwin ... или я опять что-то упустил
Автор: Setuper 24.2.2010, 12:36
в функцию lock2key передавать нужно весь параметр команды $Lock
Автор: Sergey2009 24.2.2010, 12:40
Цитата(Setuper @ 24.2.2010, 14:36)
в функцию lock2key передавать нужно весь параметр команды $Lock
Да я уж по разному пробовал...а эту функцию кто-нибудь проверял?
Автор: Setuper 24.2.2010, 12:48
если в параметре команды $Lock есть подстрока " Pk=", то нужно взять подстроку до " Pk=", в противном случае если есть пробел, то взять подстроку до пробела, иначе взять полностью весь параметр.
Автор: Sergey2009 24.2.2010, 13:08
См. файл
Автор: Setuper 24.2.2010, 13:31
Ну что тут можно сказать... Где-то ты наврал в коде. Ты получаешь неправильный ключ. Вот я получил по твоему параметру lock правильный ключ.
разбирайся где у тебя там ошибка.
Автор: Sergey2009 24.2.2010, 13:36
Это не я в коде наврал, а функция Lock2Key не возвращает то, что нужно. Я и спрашиваю, функцию Lock2Key на С# кто-нибудь проверял?
Автор: Setuper 24.2.2010, 13:40
Я её не проверял. Я надеялся, что Markiz проверил, прежде чем публиковать в теме http://mydc.ru/topic2989.html Видимо он накосячил с этой функцией.
Автор: Sergey2009 24.2.2010, 13:41
Блин ((
Автор: Setuper 24.2.2010, 13:45
Ща я попробую написать её под С#, хоть и не владею синтаксисом данного языка.
То есть, вместо каждого нулевого символа в ключ нужно вставить строку "/%DCN000%/" Вместо 5-го ANSI символа нужно вставить строку "/%DCN005%/" Символ $ в ключе заменяем на "/%DCN036%/" Символ ` в ключе заменяем на "/%DCN096%/" Символ | в ключе заменяем на "/%DCN124%/" Символ ~ в ключе заменяем на "/%DCN126%/"
Не знаю как в шарпе ты это будешь делать, в с/c++ это можно было сделать, например, функцией sprintf.
Автор: Sergey2009 24.2.2010, 14:20
Экран у меня сделан, сейчас допроверю ответ функции