Казалось бы все просто . Есть список хостов . Есть 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 через сокеты ?
Здравствуйте, 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 вполне себе есть.
Здравствуйте, DrunkPilot, Вы писали:
DP>Вопрос как правильно в винде сделать timeout ns запроса . Велосипедить свой gethostbyname через сокеты ?
GetAddrInfoExW
Макрос UNICODE влияет на то, во что превратится GetAddrInfoEx, в GetAddrInfoExA или GetAddrInfoExW. Судя по описанию, таймаут поддерживается только юникодной версией этой функции (GetAddrInfoExW). Но никто не мешает использовать ее напрямую, тогда макрос UNICODE не будет ни на что влиять.
Здравствуйте, Pzz, Вы писали:
Pzz>GetAddrInfoExW
Pzz>Макрос UNICODE влияет на то, во что превратится GetAddrInfoEx, в GetAddrInfoExA или GetAddrInfoExW. Судя по описанию, таймаут поддерживается только юникодной версией этой функции (GetAddrInfoExW). Но никто не мешает использовать ее напрямую, тогда макрос UNICODE не будет ни на что влиять.
Добавлю, что ситуация аналогична ReadDirectoryChangesW, с той разницей, что для нее вообще не существует неюникодной версии. Это не мешает вызывать ее в неюникодных приложениях
Здравствуйте, 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)
Здравствуйте, Evgeniy Skvortsov, Вы писали:
ES>Как-то колхозил сетевые запросы с тайм-аутом, сделал через запуск функции в отдельном потоке и WaitForSingleObject с тайм-аутом. Вроде работало
Здравствуйте, IID, Вы писали:
IID>Здравствуйте, Evgeniy Skvortsov, Вы писали:
ES>>Как-то колхозил сетевые запросы с тайм-аутом, сделал через запуск функции в отдельном потоке и WaitForSingleObject с тайм-аутом. Вроде работало
IID>... а потоки продолжали плодиться и ждать
В конце концов сработает встроенный в систему таймаут. Семь секунд по-умолчанию, вроде.
Здравствуйте, DrunkPilot, Вы писали:
DP>Казалось бы все просто . Есть список хостов . Есть api GetAddrInfoEx , где присутствует аргумент timeout .
Удалось решить проблему?
Тоже пробую GetAddrInfoEx (W), но получаю ошибку "неверный параметр", если выставляю ненулевой указатель на таймаут. Как будто параметр timeout вообще не поддерживается, хотя у меня винда десятка...
Проект Ребенок8020 — пошаговый гайд как сделать, вырастить и воспитать ребенка.