Зависає gethostbyaddr при запущеній асьці що робити?
Доброго дня.
Зіткнувся з такою проблемою:
При запущеній асьці зависає gethostbyaddr в моїй проге.
З чим це може бути пов'язано? Наприклад чи може аська міняти будь-які параметри таймаутів або ще що.
І як зробити щоб все працювало?
Хто така "запущена аська". В обличчя ?
> Хто така "запущена аська". В обличчя ?
Хм. Вимовити фразу "ICQ-клієнт такий-то версії розробки фірми Мірабіліс" - це. видать, складно.
> Чи може аська міняти будь-які параметри таймаутів або
> Ще що
Не думаю.
Накой йому це треба, питається?
Думаю, проблема в чомусь іншому
> Хм. Вимовити фразу "ICQ-клієнт такий-то версії розробки фірми Мірабіліс" - це. видать, складно.
> Думаю, проблема в чомусь іншому
Які є ідеї? Завісімасть чітка і стабільна.
> Накой йому це треба, питається?
Наприклад для своєї роботи аська допускає великі затримки відповіді з мережі тому вона налаштовує таймаут на те значення яке її потрібно. Я ж ніяких таймаутів не налаштовувати і тому при запущеній асьці користуюся її настройками і можливо gethostbyaddr не зависає а просто чекає дуже великий таймаут.
ДЕ в первісному питанні це фігурує?
Ніде.
> При запущеній асьці
Так ФІХ тебе знає, що ти маєток на увазі при цьому під виразом "заспущенная аська").
> При запущеній асьці користуюся її настройками
> ЦЕ ще # XA0; куди?)
Якщо настройки які робить аська глобальні то моя програма автоматом їх використовує.
Мдя. Я ж тобі разьяснял принцип даної дії в публічному чаті. Так і не вийшло? Давай - роби демо приклад який у тебе стабільно висне і кидай сюди. Будемо розбиратися.
> Роби демо приклад який у тебе стабільно висне
Він висне досить рідко але при запущеній Аське на одному з 300 комп'ютерів зависає.
При незапущеній нормально проходить все що належить.
Причому є залежність від чого то ще. Оскільки іноді і при асьці НЕ висне :(
Якщо вдасться локалізувати баг викладу код.
Коротше висне ось цей код
Що таке InvertIP (ADDR) ;?
> Що таке InvertIP (ADDR);
Моя функція яка переставляє порядок проходження байт
Виявив ще одну особливість.
Якщо залишити отну # XA0; gethostbyaddr то все оре добре. Якщо додати в коді ще й підключення компа
WNetAddConnection2
WNetCancelConnection2
Те починає виснути :(
# XA0; with temp do
# XA0; # XA0; begin
# XA0; # XA0; # XA0; dwType: = RESOURCETYPE_DISK;
# XA0; # XA0; # XA0; lpLocalName: = nil;
# XA0; # XA0; # XA0; lpRemoteName: = PChar ( "" + s);
# XA0; # XA0; # XA0; lpProvider: = "";
# XA0; # XA0; end;
# XA0; j: = WNetAddConnection2 (temp, nil, nil, 0); # XA0; // Підключити компутер
Тобто виходить що виклик цих функцій як то позначається на наступних викликах gethostbyaddr
Ось швидше за все на цьому у тебе і висне тому що не оголошено lpProvider.
Код визначення імені провайдера:
function TMainForm.GetProvider (const CompName: String): String;
var
# XA0; Buffer: array [0..255] of Char;
# XA0; Size: DWORD;
begin
# XA0; Size: = SizeOf (Buffer);
# XA0; if WNetGetProviderName (WNNC_NET_LANMAN, @Buffer, Size) <> NO_ERROR then
# XA0; # XA0; Result: = "absent"
# XA0; else
# XA0; # XA0; Result: = String (Buffer);
end;
Визначення імені провайдера не допомогло.
спостереження:
Частота зависання з аською і без аськи відрізняються приблизно рази в три. Без аськи один завісон на 1500 комп'ютерів. З аською один на 500.
Сергій М.
А навіщо було знати версію Аськи? Є якісь відомих глюки з іншими версіями асьці?
> Навіщо було знати версію Аськи?
Де я питав про "версію".
Я питав про # XA0; конкретного клієнта цієї мережі). Яких на сьогодні існує безліч безліч - Mirabilis ICQ Client, Miranda, Trillian, RAT RQ і т.д. і т.п.
Значить є якісь глюки з цими клієнтами?
Мною такі не помічені
> Мною такі не помічені
Тоді яка різниця який клієнт? ;)
> Яка різниця який клієнт?
Ну хіба мало який ще (крім широковідомих) ти користуєшся.
Вставка в кінці кожного потоку Sleep (1000); істотно поліпшила ситуацію але остаточно проблему не зняла.
> Вставка в кінці кожного потоку
Що є "кінець потоку"?
Ілюструє в коді.
старт потік
пінг
витягти MAC
якщо Mac є
# XA0; виконати
# XA0; # XA0; begin
# XA0; # XA0; # XA0; GetHostByAddr;
# XA0; # XA0; # XA0; WNetAddConnection2;
# XA0; # XA0; # XA0; WNetCancelConnection2;
# XA0; # XA0; end;
Sleep (1000);
кінець потоку
І як цей код пов'язаний з "настройками аськи"?
До того ж ти стверджуєш, що потік висне до sleep "a.
> І як цей код пов'язаний з "настройками аськи"?
> До того ж ти стверджуєш, що потік висне до sleep "a.
Якщо при додаванні WNetAddConnection2; # XA0; WNetCancelConnection2; починає виснути GetHostByAddr; то логічно припустити що висне наступний потік а не поточний. Як це можливо поняття не маю. Можливо дані операції вимагають деякого часу для свого завершення. І якщо не дати їм цього часу то GetHostByAddr; може зависнути.
Але факт залишається фактом. Глюк істотно зменшився.
Думаю що Аська зі своїми "настройками" тут абсолютно ні при чому - справа відбувається в Маздай (Маздай = win9x / Me), а маздайная реалізація WNet-функціональності завжди славилася своєю "глюкавий".
> Думаю що Аська зі своїми "настройками" тут абсолютно ні при чому
Досвід говорить про інше. А що саме вліет визначити складно. Або крива реалізація чого то в асьці заважає працювати іншим прогам в мережі. Або сама вінда яка не тягне таке навантаження. Хоча кількістю потоків я пробував грати. Резульат той же.
А що власне мається на увазі під "зависає"?
Ф-ція GetHostByAddr будучи викликаної зовсім не повертає управління або виконується невиправдано довго?
Може слід відмовитися від блокує ф-ції на користь її асинхронної версії (WSAAsyncGetHostByAddr)?
> Ф-ція GetHostByAddr будучи викликаної зовсім не повертає управління або виконується невиправдано довго?
Точно не знаю. Але за час порядку години вона управління не повернула :(
> Може слід відмовитися від блокує ф-ції на користь її асинхронної версії (WSAAsyncGetHostByAddr)?
Це істотно змінить логіку роботи програми. Та й сама функція без WNetAddConnection2; # XA0; WNetCancelConnection2; працює просто чудово.
А відладчик на що?
> Це істотно змінить логіку роботи програми
Ну хоча б заради експерименту.
> А відладчик на що?
А як відловити отладчиком зависання деякою функції в багатопотоковому додатку якщо ймовірність зависання 1/500?
А в чому взагалі таємний сенс підключати ресурс і тут же його відключати?
Сенс в тому щоб знайти де у бага ноги ростуть. А реально після підключення компа ще його сканування є. Але воно час забирає а поки ще не глючить. Тому і вимкнено