Зависає gethostbyaddr при запущеній асьці що робити

Зависає 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?

А в чому взагалі таємний сенс підключати ресурс і тут же його відключати?

Сенс в тому щоб знайти де у бага ноги ростуть. А реально після підключення компа ще його сканування є. Але воно час забирає а поки ще не глючить. Тому і вимкнено