Форум: "Сети";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
ВнизЗависает gethostbyaddr при запущенной аське что делать? Найти похожие ветки
← →
MegaVolt © (2006-03-24 14:36) [0]Добрый день.
Столкнулся с такой проблемой:
При запущенной аське зависает gethostbyaddr в моей проге.
С чем это может быть связано? Например может ли аська менять какие либо параметры таймаутов или ещё что.
И как сделать чтобы всё работало?
← →
Сергей М. © (2006-03-24 14:59) [1]
> запущенной аське
Кто такая "запущенная аська" ? В лицо ?
← →
MegaVolt © (2006-03-24 15:03) [2]>Кто такая "запущенная аська" ? В лицо ?
ICQ Version 2002а
Build #3727
← →
Сергей М. © (2006-03-24 15:17) [3]
> MegaVolt © (24.03.06 15:03) [2]
Хм .. Произнести фразу "ICQ-клиент такой-то версии разработки фирмы Мирабилис" - это , видать, сложно ..
> может ли аська менять какие либо параметры таймаутов или
> ещё что
Не думаю.
Накой ему это надо, спрашивается ?
Думаю, проблема в чем-то другом
← →
MegaVolt © (2006-03-24 15:32) [4]>Хм .. Произнести фразу "ICQ-клиент такой-то версии разработки фирмы Мирабилис" - это , видать, сложно ..
Я же и написал ICQ версии 2002а произведён ICQ Inc
>Думаю, проблема в чем-то другом
Какие есть идеи? Зависимасть чёткая и стабильная.
← →
MegaVolt © (2006-03-24 16:03) [5]>Накой ему это надо, спрашивается ?
Например для своей работы аська допускает большие задержки ответа из сети поэтому она настраивает таймаут на то значение которое её нужно. Я же никаких таймаутов не настраиваю и поэтому при запущенной аське пользуюсь её настройками и возможно gethostbyaddr не зависает а просто ждёт очень большой таймаут.
← →
Сергей М. © (2006-03-24 16:24) [6]
> Я же и написал ICQ версии 2002а произведён ICQ Inc
ГДЕ в первоначальном вопросе это фигурирует ?
НИгде.
Цитирую тебя:
> При запущенной аське
Да фих тебя знает, что ты имешь ввиду при этом под выражением "заспущенная аська") ..
> при запущенной аське пользуюсь её настройками
ЭТО еще куда ?)
← →
MegaVolt © (2006-03-24 16:42) [7]>ЭТО еще куда ?)
Если настройки которые делает аська глобальные то моя программа автоматом их использует.
← →
Rouse_ © (2006-03-26 00:32) [8]Мдя... Я же тебе разьяснял принцип данного действия в привате. Так и не получилось? Давай - делай демо пример который у тебя стабильно виснет и кидай сюда... Будем разбираться.
← →
MegaVolt © (2006-03-27 10:45) [9]>делай демо пример который у тебя стабильно виснет
Он виснет достаточно редко но при запущенной Аське на одном из 300 компов зависает.
При незапущенной нормально проходит всё что положено.
Причём есть зависимость от чего то ещё. Т.к. иногда и при аське не виснет :(
Если удастся локализовать баг выложу код.
← →
MegaVolt © (2006-03-27 16:58) [10]Короче виснет вот этот код
function GetHostByIP(ADDR: cardinal;OsNT:boolean):string; // Определение имени компьютера по IP адресу
var HOST: PHostEnt;
begin
ADDR:=InvertIP(ADDR);
HOST:=gethostbyaddr(@ADDR,4,AF_INET);
if HOST <> nil
then
begin
SetLength(Result,Length(Host.h_name));
if OsNT
then Result:=Host.h_name
else OemToChar(Host.h_name,@Result[1]);
end
else result:="";
end;
← →
Rouse_ © (2006-03-27 17:40) [11]Что такое InvertIP(ADDR);?
← →
MegaVolt © (2006-03-27 19:00) [12]>Что такое InvertIP(ADDR);
Моя функция которая переставляет порядок следования байт
Обнаружил ещё одну особенность.
Если оставить отну gethostbyaddr то всё пашет хорошо. Если добавить в коде ещё и подключение компа
WNetAddConnection2
WNetCancelConnection2
То начинает виснуть :(
Код такой:
var
temp:TNetResource;
with temp do
begin
dwType:= RESOURCETYPE_DISK;
lpLocalName:= nil;
lpRemoteName :=PChar("\\"+s);
lpProvider:="";
end;
j:=WNetAddConnection2(temp,nil,nil,0); // Подключить компутер
...
WNetCancelConnection2(temp.lpRemoteName,0,false);
Т.е. получается что вызов этих функций как то сказывается на последующих вызовах gethostbyaddr
← →
Rouse_ © (2006-03-28 10:22) [13]Вот скорее всего на этом у тебя и виснет ибо не обьявлен lpProvider.
Код определения имени провайдера:function TMainForm.GetProvider(const CompName: String): String;
var
Buffer: array [0..255] of Char;
Size: DWORD;
begin
Size := SizeOf(Buffer);
if WNetGetProviderName(WNNC_NET_LANMAN, @Buffer, Size) <> NO_ERROR then
Result := "absent"
else
Result := String(Buffer);
end;
← →
MegaVolt © (2006-03-28 11:45) [14]Определение имени провайдера не помогло.
Наблюдение:
Частота зависания с аськой и без аськи отличаются примерно раза в три. Без аськи один зависон на 1500 компов. С аськой один на 500.
← →
MegaVolt © (2006-03-28 15:34) [15]Сергей М.
А зачем было знать версию Аськи? Есть какие то извесные глюки с другими версиями аськами?
← →
Сергей М. © (2006-03-28 15:59) [16]
> зачем было знать версию Аськи?
Где я спрашивал про "версию" ?!
Я спрашивал про конкретного клиента этой сети) ... Коих на сей день существует несметное множество - Mirabilis ICQ Client, Miranda, Trillian, RAT &RQ и т.д. и т.п.
← →
MegaVolt © (2006-03-28 16:51) [17]Значит есть какие то глюки с этими клиентами?
← →
Сергей М (2006-03-28 18:53) [18]Мною таковые не замечены
← →
MegaVolt © (2006-03-29 10:25) [19]>Мною таковые не замечены
Тогда какая разница какой клиент? ;)
← →
Сергей М. © (2006-03-29 10:35) [20]
> какая разница какой клиент?
Ну мало ли какой еще (кроме широкоизвестных) ты пользуешь ..
← →
MegaVolt © (2006-03-30 13:01) [21]Вставка в конце каждого потока Sleep(1000); существенно улучшила ситуацию но окончательно проблему не сняла.
← →
Сергей М. © (2006-03-30 13:23) [22]
> Вставка в конце каждого потока
Что есть "конец потока" ?
Иллюстрируй в коде ..
← →
MegaVolt © (2006-03-30 18:38) [23]
Старт поток
Пинг
извлечь MAC
если Mac есть
выполнить
begin
GetHostByAddr;
WNetAddConnection2;
WNetCancelConnection2;
end;
Sleep(1000);
конец потока
← →
Сергей М. © (2006-03-31 08:26) [24]И как этот код связан с "настройками аськи" ?
К тому же ты утверждаешь, что поток виснет до sleep"a ..
← →
MegaVolt © (2006-03-31 10:34) [25]>И как этот код связан с "настройками аськи" ?
Если бы я знал :(
>К тому же ты утверждаешь, что поток виснет до sleep"a ..
Если при добавлении WNetAddConnection2; WNetCancelConnection2; начинает виснуть GetHostByAddr; то логично предположить что виснет следующий поток а не текущий. Как это возможно понятия не имею. Возможно данные операции требуют некого времени для своего завершения. И если не дать им этого времени то GetHostByAddr; может зависнуть.
Но факт остаётся фактом. Глюк существенно уменьшился.
← →
Сергей М. © (2006-03-31 10:44) [26]Думаю что Аська со своими "настройками" здесь совершенно ни при чем - дело происходит в Маздае (Маздай = win9x/Me), а маздайная реализация WNet-функциональности всегда славилась своей "глюкавостью".
← →
MegaVolt © (2006-03-31 11:15) [27]>Думаю что Аська со своими "настройками" здесь совершенно ни при чем
Опыт говорит о другом. А что именно влиет определить сложно. Или кривая реализация чего то в аське мешающее работать другим прогам в сети. Или сама винда которая не тянет такую нагрузку. Хотя количеством потоков я пробовал играть. Резульат тот же.
← →
Сергей М. © (2006-03-31 11:23) [28]А что собственно подразумевается под "зависает" ?
Ф-ция GetHostByAddr будучи вызванной совсем не возвращает управление или выполняется неоправданно долго ?
Может следует отказаться от блокирующей ф-ции в пользу ее асинхронной версии (WSAAsyncGetHostByAddr) ?
← →
MegaVolt © (2006-03-31 11:37) [29]>Ф-ция GetHostByAddr будучи вызванной совсем не возвращает управление или выполняется неоправданно долго ?
Точно не знаю. Но за время порядка часа она управление не вернула :(
>Может следует отказаться от блокирующей ф-ции в пользу ее асинхронной версии (WSAAsyncGetHostByAddr) ?
Это существенно изменит логику работы приложения. Да и сама функция без WNetAddConnection2; WNetCancelConnection2; работает просто великолепно.
← →
Сергей М. © (2006-03-31 12:32) [30]
> Точно не знаю
А отладчик на что ?
> Это существенно изменит логику работы приложения
Ну хотя бы ради эксперимента ..
← →
MegaVolt © (2006-03-31 13:15) [31]>А отладчик на что ?
А как отловить отладчиком зависание некой функции в многопоточном приложении если вероятность зависания 1/500?
← →
Сергей М. © (2006-03-31 13:32) [32]А в чем вообще тайный смысл подключать ресурс и тут же его отключать ?
← →
MegaVolt © (2006-03-31 14:36) [33]Смысл в том чтобы найти где у бага ноги растут. А реально после подключения компа ещё его сканирование есть. Но оно время отнимает а пока ещё не глючило. Поэтому и выключено
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.041 c