Модераторы: Snowy, Poseidon, MetalFan

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Протокол ICQ (Delphi), Помогите реализовать несколько функций 
:(
    Опции темы
Zlo
Дата 11.10.2004, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



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

я уже 3 дня бьюсь как это сделать, но нефига неполучается.
я использую компонент ICQ Client товарища coban2k

все это реализуется в отдельном потоке
PM MAIL   Вверх
Alkash
Дата 11.10.2004, 01:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Подключение к серваку аськи реализуется примерно так:
Код
procedure TForm1.icq_Login(Status : longint);
begin
 // определяем свой IP-адрес
 Local_IP := Get_my_IP;
 // преобразуем его в DIM_IP
 StrToIP(Local_IP,DIM_IP);
 // Запоминаем, какой будет наш статус
 ICQStatus := Status;
 // если ClientSocket открыт, то закроем его
 if CLI.Active then
   CLI.Close;
 // установим флажок isAuth,
 // это значит, что сначала мы коннектимся к серверу
 // авторизации. UIN и пароль передаются именно ему.
 isAuth := true;
 // устанавливаем флажок isHDR,
 // он говорит нам о том, что, самые первые данные ,
 // из ClientSocket следует интерпретировать как
 // FLAP-заголовок
 isHDR := true;
 // заполняем поля Host и Port в ClintSocket,
 // адрес сервера авторизации: 'login.icq.com'
 // и его порт: 5190
 CLI.Address :='';
 CLI.Host := 'login.icq.com';
 CLI.Port := 5190;
 // не забываем и про TMemo
 M(Memo,'>>>>>>>>>>  login.icq.com:5190 <<<<<<<<<<<');
 // ... и собственно CONNECT
 CLI.Open;
end;

Добавлено @ 01:41
Авторизация примерно так:
Код
procedure TForm1.AuthorizePart(p:PPack);
var ss : string;
   T : integer;
   tmp : PPack;
begin
    // позиционируемся на начало блока данных, пропустив заголовок
    PacketGoto(p,sizeof(FLAP_HDR));
    // если FLAP-данные содержат лишь 00000001,
    // то это самое начало сессии
    if (swap(p^.Len)=4)and
       (swap(p^.SNAC.FamilyID)=0)and
       (swap(p^.SNAC.SubTypeID)=1) then begin
      M(Memo,'< Authorize Server CONNECT');
             // каждый раз, когда начинается новая TCP-сессия,
             // присваиваем SEQ случайное начальное значение
      SEQ := random($7FFF);       // в ответ надо передать пакет с UINом и паролем
      // создаем объект-пакет типа PPack: в нем формируется
      // FLAP-заголовок с Chanel_ID=1
      tmp := CreatePacket(1,SEQ);
      // сначала надо вставить такой же DWORD=00000001
      // (еще надо помнить о порядке следования байтов в DWORD !!!)
      PacketAppend32(tmp,DSwap(1));
      // далее в поле данных добавляются несколько TLV
      // это наш UIN -  TLV(1)
      TLVAppendStr(tmp,$1,s(UIN));
      // и закодированный пароль - TLV(2)
      TLVAppendStr(tmp,$2,Calc_Pass(PASSWORD));
      // описывать содержимое других TLV особого смысла нет
      TLVAppendStr(tmp,$3,
        'ICQ Inc. - Product of ICQ (TM).2000a.4.31.1.3143.85');
      TLVAppendWord(tmp,$16,$010A);
      TLVAppendWord(tmp,$17,$0004); // 4 - для ICQ2000a
      TLVAppendWord(tmp,$18,$001F);
      TLVAppendWord(tmp,$19,$0001);
      TLVAppendWord(tmp,$1A,$0C47);
      TLVAppendDWord(tmp,$14,$00000055);
      TLVAppendStr(tmp,$0F,'en');
      TLVAppendStr(tmp,$0E,'us');
      // посылаем пакет через  ClientSocket
      // (здесь tmp-пакет будет также и удален)
      PacketSend(tmp);
      M(Memo,'> Auth Request (Login)');

    end else  
    // на это сервер ответит так:
    // его ответ содержит TLV(1) - т.е. наш UIN
    if (TLVReadStr(p,ss)=1)and(ss=s(UIN))then begin
       // если это так, то считаем следующий TLV
       T := TLVReadStr(p,ss);
       case T of
         // если это TLV(5) - значит это адрес и порт основного сервера
         5: g>begin // BOS-IP:PORT
           M(Memo,'< Auth Responce (COOKIE)');
           // запоминаем и адрес и порт
           WorkAddress := copy(ss,1,pos(':',ss)-1);
           WorkPort := strtoint(copy(ss,pos(':',ss)+1,
                             length(ss)-pos(':',ss)));
           // за ними должен быть и TLV(6) - т.н. COOKIE (256 байт)
           // принимаем его прямо в переменную sCOOKIE
           // (он пригодится при коннекте к основному серверу)
           if (TLVReadStr(p,sCOOKIE)=6) then begin;
             // COOKIE получен и значит пора разъединяться
             // формируем пустой пакет с Channel_ID=4
             tmp:=CreatePacket(4,SEQ); // ChID=4
             // который и передаем
             PacketSend(tmp);
             // закрываем свой ClientSocket
             OfflineDiscconnect1Click(self);
             // говорим себе, что авторизация пройдена
             isAuth := false;
             // настраиваем ClientSocket на адрес:порт
             // основного (BOS) сервера
             CLI.Address := WorkAddress;
             CLI.Host := '';
             CLI.Port := WorkPort;
             M(Memo,'');
             M(Memo,'>>> Connecting to BOS: '+ss);
             // и коннектимся к нему
             CLI.Open;
{ ******************************************* }
{ в этом месте заканчивается этап авторизации }
{ ******************************************* }
           end;
         end;
         // а, например, в случае неверного UINа или пароля
         // мы получим TLV(4) и TLV(8)
         4,8: begin
              M(Memo,'< Auth ERROR');
              M(Memo,'TLV($'+inttohex(T,2)+') ERROR');
              M(Memo,'STRING: '+ss);
              if pos('http://',ss)>0 then begin
                // и даже можем загрузить в браузер присланный нам URL
                // с описанием ошибки
                // Web.Navigate(ss);
                // {это навигатор с панели компонентов Делфи}
              end;
              TLVReadStr(p,ss); M(Memo,ss);
              // конечно же закрываем ClientSocket
              OfflineDiscconnect1Click(self);
              M(Memo,'');
            end;
       end;
    end;
end;




--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
Zlo
Дата 11.10.2004, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Да этот исходник я уже видел.
Может ктонить ище чего подскажет?
PM MAIL   Вверх
Zlo
Дата 11.10.2004, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Ктонить может подсказать как приостанавливать выполнение цикла
пока выполняется в нем какаето функция
PM MAIL   Вверх
foRaver
Дата 11.10.2004, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 561
Регистрация: 6.7.2003
Где: Düsseldorf

Репутация: нет
Всего: 3



Вот тут: Link лежит документация по протоколам Oscar 7/8. Это протоколы ICQ. Думаю ты сможешь найти то, что тебе надо.
PM MAIL WWW ICQ YIM   Вверх
Alex
Дата 11.10.2004, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 4147
Регистрация: 25.3.2002
Где: Москва

Репутация: 4
Всего: 162



Цитата(Zlo @ 11.10.2004, 19:32)
Ктонить может подсказать как приостанавливать выполнение цикла
пока выполняется в нем какаето функция

Код
break;


Это сообщение отредактировал(а) Alex - 11.10.2004, 18:41


--------------------
Написать можно все - главное четко представлять, что ты хочешь получить в конце. 
PM Skype   Вверх
Cheba
Дата 11.10.2004, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pointless one
***


Профиль
Группа: Vingrad developer
Сообщений: 1777
Регистрация: 27.11.2003
Где: /dev/null

Репутация: нет
Всего: 62



Alex, я не согласен. Break - это выход из цикла, а не "подождать пока что-то выполняется". Человеку просто нужно подождать пока произойдет соединение и авторизация, я так понимаю. Наверное, эти вункции асинхронны.

PM MAIL ICQ   Вверх
Zlo
Дата 12.10.2004, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Cheba
Ты прав.
Вот еслиб кто помог....
код нисать smile.gif
PM MAIL   Вверх
Alkash
Дата 12.10.2004, 00:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Может Sleep();?


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
stab
Дата 12.10.2004, 03:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



дык, у TICQClient событий дофига разных, вещай обработчик на какое-нить, например первое что я увидел -- OnAuthorizationChangedOk

з.ы. а пароли перебирать не хорошо, особенно чужие, только не надо говорить, что свой забыл.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Akella
Дата 12.10.2004, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 4
Всего: 329



а может что-то типа suspend
PM MAIL   Вверх
x77
Дата 12.10.2004, 15:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 1
Всего: 22



если всё действительно в потоке, то просто усыплять поток да и всё. другой вариант - как уже было сказано, цепляться на событие об обломе авторизации, в нём задавать новые логин/пароль, и логиниться заново.

если функции сами по себе асинхронны, нафига вообще поток?


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Yura_Matsuk
Дата 12.10.2004, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 16.5.2004

Репутация: нет
Всего: нет



Эй! А где взять TICQClient?
--------------------
Смех смехом, а ОНА кверху мехом...
PM MAIL   Вверх
Zlo
Дата 12.10.2004, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 235
Регистрация: 18.9.2004

Репутация: нет
Всего: 1



Мне это нужно не для подбора пароля.
Ктонить может прислать рабочий код? Пожалуйста
PM MAIL   Вверх
deMike
  Дата 12.10.2004, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


M.Shinoda
**


Профиль
Группа: Участник
Сообщений: 361
Регистрация: 12.10.2004
Где: Санкт-Петербург

Репутация: нет
Всего: 0



Простите за Флейм но,
Насколько я понял, ты хочешь написать ICQ клиент, а может создашь тему в форуме Поиск патнёров для совместной разработки проектов, и там можно обсудить твою идею! Так будет легче не только для тебя, но и польза другим!

Это сообщение отредактировал(а) Мастeр - 12.10.2004, 18:01
PM MAIL WWW   Вверх
Закрытая темаСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0573 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.