Как прикрутить timeout к dns запросу
От: DrunkPilot  
Дата: 17.02.19 12:54
Оценка:
Казалось бы все просто . Есть список хостов . Есть api GetAddrInfoEx , где присутствует аргумент timeout .
Однако

An optional parameter indicating the time, in milliseconds, to wait for a response from the namespace provider before aborting the call.

This parameter is only supported when the UNICODE or _UNICODE macro has been defined in the sources before calling the GetAddrInfoEx function. Otherwise, this parameter is currently reserved and must be set to NULL since a timeout option is not supported.

Вопрос как правильно в винде сделать timeout ns запроса . Велосипедить свой gethostbyname через сокеты ?
Re: Как прикрутить timeout к dns запросу
От: Maniacal Россия  
Дата: 18.02.19 13:07
Оценка:
Здравствуйте, DrunkPilot, Вы писали

DP>Казалось бы все просто . Есть список хостов . Есть api GetAddrInfoEx , где присутствует аргумент timeout .

DP>Однако
DP>

DP>An optional parameter indicating the time, in milliseconds, to wait for a response from the namespace provider before aborting the call.

DP>This parameter is only supported when the UNICODE or _UNICODE macro has been defined in the sources before calling the GetAddrInfoEx function. Otherwise, this parameter is currently reserved and must be set to NULL since a timeout option is not supported.

DP>Вопрос как правильно в винде сделать timeout ns запроса . Велосипедить свой gethostbyname через сокеты ?

Использовать UNICODE? Другое решение сделать вызов асинхронным и прерывать по таймауту, правда параметр lpOverlapped тоже

This parameter is only supported when the UNICODE or _UNICODE macro has been defined in the sources before calling the GetAddrInfoEx function.


Можно в отдельном потоке, в лямбда-функцции, как пример, делать запрос, ждать, если время истекло, просто забивать на поток. Таймаут всё равно через какое-то время случится и поток завершится. А если через WinAPI поток запускать, так там и TerminateThread вполне себе есть.
Re: Как прикрутить timeout к dns запросу
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.02.19 14:43
Оценка: +2
Здравствуйте, DrunkPilot, Вы писали:

DP>Вопрос как правильно в винде сделать timeout ns запроса . Велосипедить свой gethostbyname через сокеты ?


GetAddrInfoExW

Макрос UNICODE влияет на то, во что превратится GetAddrInfoEx, в GetAddrInfoExA или GetAddrInfoExW. Судя по описанию, таймаут поддерживается только юникодной версией этой функции (GetAddrInfoExW). Но никто не мешает использовать ее напрямую, тогда макрос UNICODE не будет ни на что влиять.
Re[2]: Как прикрутить timeout к dns запросу
От: Pavel Dvorkin Россия  
Дата: 19.02.19 03:01
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>GetAddrInfoExW


Pzz>Макрос UNICODE влияет на то, во что превратится GetAddrInfoEx, в GetAddrInfoExA или GetAddrInfoExW. Судя по описанию, таймаут поддерживается только юникодной версией этой функции (GetAddrInfoExW). Но никто не мешает использовать ее напрямую, тогда макрос UNICODE не будет ни на что влиять.


Добавлю, что ситуация аналогична ReadDirectoryChangesW, с той разницей, что для нее вообще не существует неюникодной версии. Это не мешает вызывать ее в неюникодных приложениях
With best regards
Pavel Dvorkin
Re: Как прикрутить timeout к dns запросу
От: Lonely Dog Россия  
Дата: 20.03.19 07:36
Оценка: 1 (1)
Здравствуйте, DrunkPilot, Вы писали:

DP>Казалось бы все просто . Есть список хостов . Есть api GetAddrInfoEx , где присутствует аргумент timeout .

DP>Однако
DP>

DP>An optional parameter indicating the time, in milliseconds, to wait for a response from the namespace provider before aborting the call.

DP>This parameter is only supported when the UNICODE or _UNICODE macro has been defined in the sources before calling the GetAddrInfoEx function. Otherwise, this parameter is currently reserved and must be set to NULL since a timeout option is not supported.

DP>Вопрос как правильно в винде сделать timeout ns запроса . Велосипедить свой gethostbyname через сокеты ?

Мы просто перешли на другой DNS клиент: https://c-ares.haxx.se/
В итоге получили кроссплатформенное решение (Windows/OSX/Linux)
Re: Как прикрутить timeout к dns запросу
От: Evgeniy Skvortsov Россия  
Дата: 24.03.19 20:52
Оценка:
Здравствуйте, DrunkPilot, Вы писали:

DP>Вопрос как правильно в винде сделать timeout ns запроса . Велосипедить свой gethostbyname через сокеты ?


Как-то колхозил сетевые запросы с тайм-аутом, сделал через запуск функции в отдельном потоке и WaitForSingleObject с тайм-аутом. Вроде работало
Re[2]: Как прикрутить timeout к dns запросу
От: IID Россия  
Дата: 28.03.19 16:59
Оценка:
Здравствуйте, Evgeniy Skvortsov, Вы писали:

ES>Как-то колхозил сетевые запросы с тайм-аутом, сделал через запуск функции в отдельном потоке и WaitForSingleObject с тайм-аутом. Вроде работало


... а потоки продолжали плодиться и ждать
kalsarikännit
Re[3]: Как прикрутить timeout к dns запросу
От: Maniacal Россия  
Дата: 29.03.19 06:42
Оценка:
Здравствуйте, IID, Вы писали:

IID>Здравствуйте, Evgeniy Skvortsov, Вы писали:


ES>>Как-то колхозил сетевые запросы с тайм-аутом, сделал через запуск функции в отдельном потоке и WaitForSingleObject с тайм-аутом. Вроде работало


IID>... а потоки продолжали плодиться и ждать


В конце концов сработает встроенный в систему таймаут. Семь секунд по-умолчанию, вроде.
Re: Как прикрутить timeout к dns запросу
От: Basil2 Россия https://starostin.msk.ru
Дата: 07.11.22 09:08
Оценка:
Здравствуйте, DrunkPilot, Вы писали:

DP>Казалось бы все просто . Есть список хостов . Есть api GetAddrInfoEx , где присутствует аргумент timeout .


Удалось решить проблему?

Тоже пробую GetAddrInfoEx (W), но получаю ошибку "неверный параметр", если выставляю ненулевой указатель на таймаут. Как будто параметр timeout вообще не поддерживается, хотя у меня винда десятка...
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.