неблокираща резолюция на мрежовия адрес (gethostbyname или getaddrinfo)?

Използване на класическа конфигурация nsswitch.conf:

hosts:      files dns

Опитът за разрешаване на име чрез gethostbyname (или getaddrinfo) може да отнеме известно време, ако DNS не отговаря (или е лошо конфигуриран).

Има ли начин да конфигурирате таймаут в nsswitch.conf или да използвате алтернативен API, който управлява таймаут?


person mpromonet    schedule 25.02.2014    source източник


Отговори (1)


Има getaddrinfo_a, но той е специфичен за Linux GNU glibc. Като алтернатива можете да създадете нишка и да извикате getaddrinfo в нея. Не използвайте gethostbyname в нишка, тъй като не е безопасно за нишки.

person Sjoerd    schedule 25.02.2014
comment
gethostbyname() не е безопасен за нишки? Как тогава изобщо може да се използва? - person Martin James; 25.02.2014
comment
gethostbyname() връща указател към структура и тази структура може да бъде презаписана от по-късни извиквания. Ако имате множество нишки, извикващи gethostbyname, структурата в една нишка може да бъде презаписана от друга нишка. Не е безопасно тази функция да се извиква многократно в различни нишки, така че не е нишка безопасна . - person Sjoerd; 25.02.2014
comment
@MartinJames Прав си, това е безопасно за нишки. MSDN gethostbyname : разпределено вътрешно от Winsock DLL от локално хранилище на нишка ... В противен случай върнатата стойност ще бъде презаписана от последващи gethostbyname или gethostbyaddr извиквания на същата нишка. - person parrowdice; 04.02.2016