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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Снова проблемы с аськой, Теперь переполнение стека... 
:(
    Опции темы
Coderr
Дата 25.3.2007, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Доброго времени суток, уважаемые форумчане! Что-то я здесь зачастил...
Так вот. Сегодня нарисовалась проблема.
Есть такой код описания события OnServerListRecv компонента TICQClient:
Код

procedure TMainForm.ICQClientServerListRecv(Sender: TObject;
  SrvContactList: TList);
var i        : Word;
    j        : integer;
    UserInfo : TUINEntry;
    b        : boolean;
begin
 if SrvContactList.Count>0 then
  for i:=0 to SrvContactList.Count-1 do begin
   UserInfo:=PUINEntry(SrvContactList.Items[i])^;
   ConsoleForm.ConsoleEdit.Lines.Add(FormTime+UserInfo.Nick+' в группе '+inttostr(UserInfo.CGroupID)+' ; '+UserInfo.Cellular+' и его UIN '+IntToStr(UserInfo.UIN));
   if UserInfo.CGroupID<>UserInfo.UIN then begin
    b:=false;
    for j:=0 to ContactList.Items.Count-1 do
     if IntToStr(UserInfo.UIN)=ContactList.Items[j].SubItems[0] then begin
      b:=true;
      exit;
     end;
    if not b then begin
     ICQClient.AddContact(UserInfo.UIN);
     with ContactList.Items.Add do begin
      if UserInfo.Nick<>'' then
       Caption:=UserInfo.Nick
      else
       Caption:=IntToStr(UserInfo.UIN);
      ImageIndex:=7;
      SubItems.Add(IntToStr(UserInfo.UIN));
     end
    end;
   end;
  end;
 ICQClient.DestroyUINList(SrvContactList);
end;


Вроде бы всё хорошо в нём... НО! Если мою программу поставить на другой комп, на котором нет файлов с контакт листом, то во время первого запуска,если в контактах уина много юзеров, прога замирает напрочь и выдаёт ошибку "Переполнение стека". Что делать?
--------------------
Кодинг - это стиль жизни!   
PM WWW ICQ   Вверх
VladBD
Дата 25.3.2007, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

Доброго времени суток, уважаемые форумчане! Что-то я здесь зачастил...

зачастил - это 10 раз один и тот же топик создал?
Наверное еще пару раз спросишь и .........модер не всегда спит....  smile 

Нарушение п.12 правил форума:  smile 
Цитата

Перед тем, как задать вопрос, поищите ответ в соответствующем разделе и FAQ, очень может быть, что такой вопрос уже задавался. 


Это сообщение отредактировал(а) VladBD - 25.3.2007, 20:31
PM MAIL   Вверх
bartram
Дата 25.3.2007, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1606
Регистрация: 22.2.2004
Где: Russia, Samara

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



да, и надо эту тему вообще в другой раздел Delphi: Сети


--------------------
В каждом из нас спит гений, но с каждым днем все крепче ;-)
bartram.ru
Twitter
user posted image 

PM MAIL ICQ   Вверх
Snowy
Дата 26.3.2007, 11:05 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Проблема с большим контакт листом состоит в том, что происходит большое кол-во отправок пакетов AddContact.
ICQ сервер этого очень не любит. Он расценивает большое кол-во пакетов, как атаку и отрубает нафиг.
Чтобы решить проблему, нужно переписать принцип отправки - отправлять всех контактов одним пакетом.
Для этого нужно внести в код ICQClient следующую модификацию:
Код

function TICQClient.AddContact(UIN: LongWord): Boolean;
begin
  Result := False;
  if FContactLst.IndexOf(IntToStr(UIN)) < 0 then
  begin
    FContactLst.Add(IntToStr(UIN));
    Result := True;
  end else
    Exit;
end;

// Snowy: add new buddies to your client-side contact list.
procedure TICQClient.AddBuddy(ContactLst: TStringList);
var pkt: TRawPkt;
begin
  if not LoggedIn then Exit;
  CreateCLI_ADDCONTACT(@pkt, ContactLst, FSeq);           {SNAC(x03/x04)}
  FSock.SendData(pkt, pkt.Len);
end;
Здесь я убрал из AddContact отправку пакета.
А саму отправку поместил в новую функцию AddBuddy.
Я не помню, правил я в ICQWorks процедуру CreateCLI_ADDCONTACT или нет.
Вроде правил. У меня она имеет такой вид:
Код

procedure CreateCLI_ADDCONTACT(Pkt: PRawPkt; UINS: TStrings; var Seq: Word);
var i: integer;
begin
  PktInit(Pkt, 2, Seq);                         //Channel 2
  PktSnac(Pkt, $03, $04, 0, 0);                 //Snac: Type x03/x04, ID x0000, Flags 0
  for i := 0 to UINS.Count - 1 do
    PktLStr(Pkt, UINS[i]);                      //UIN
  PktFinal(Pkt);                                //Finalize packet
end;

Теперь работа строится немного по другому.
Кроме AddContact теперь нужно завести StringList и занести туда каждый UIN.
По окончании обработки, нужно этот стринглист отправить через AddBuddy.
Зачем нужен отдельный стринглист: большие контакт-листы приходят не целиком, а несколькими отправками.
Поэтому отправлять AddBuddy нужно не весь лист, а только свежепринятые. Ибо повторная отправка UIN'a ведёт к обратному действию - выключает UIN.
Просто приходилось наступить на обе эти грабли smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

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

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

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

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

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


 




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


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

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