Проблема 7 posix удалена gethostbyname
, поэтому я больше не могу сделать, gethostbyname("my_hostname")
чтобы получить каноническое имя хоста для моей машины. Я пытался использовать getnameinfo
вместо этого, но дал /etc/hosts
как
127.0.0.1 localhost
127.0.0.1 my_hostname.fqdn my_hostname
Я возвращаюсь localhost
(что имеет смысл). Однако gethostbyname("my_hostname")
возвращается my_hostname.fqdn
(по крайней мере, как под musl, так и под glibc).
Есть ли разумная замена моему варианту использования в проблеме 7 или мне не повезло?
решение1
Из страницы руководства Solaris:
DESCRIPTION
These functions are used to obtain entries describing hosts.
An entry can come from any of the sources for hosts speci-
fied in the /etc/nsswitch.conf file. See nsswitch.conf(4).
These functions have been superseded by
getipnodebyname(3SOCKET), getipnodebyaddr(3SOCKET), and
getaddrinfo(3SOCKET), which provide greater portability to
applications when multithreading is performed or technolo-
gies such as IPv6 are used. For example, the functions
described in the following cannot be used with applications
targeted to work with IPv6.
Как видите, функция getaddrinfo()
также входит в стандарт POSIX и поддерживается...
решение2
Текущий совместимый с POSIX способ (попытка) определить «каноническое» полное доменное имя текущего хоста — это вызватьgethostname()
чтобы определить настроенное имя хоста, затемgetaddrinfo()
для определения соответствующей адресной информации.
Игнорирование ошибок:
char buf[256];
struct addrinfo *res, *cur;
struct addrinfo hints = {0};
hints.ai_family = AF_UNSPEC;
hints.ai_flags = AI_CANONNAME;
hints.ai_socktype = SOCK_DGRAM;
gethostname(buf, sizeof(buf));
getaddrinfo(buf, 0, &hints, &res);
for (cur = res; cur; cur = cur->ai_next) {
printf("Host name: %s\n", cur->ai_canonname);
}
Результаты во многом зависят от конфигурации системы и преобразователя.