posix의 Issue 7이 제거되었으므로 더 이상 내 컴퓨터의 정식 호스트 이름을 얻을 gethostbyname
수 없습니다 . 대신 gethostbyname("my_hostname")
사용해 보았지만 다음 과 같은 결과가 나타납니다.getnameinfo
/etc/hosts
127.0.0.1 localhost
127.0.0.1 my_hostname.fqdn my_hostname
나는 돌아올 것이다 localhost
(이건 말이 된다). 하지만 (적어도 musl 및 glibc에서는) gethostbyname("my_hostname")
반환됩니다 .my_hostname.fqdn
문제 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
현재 호스트의 "정규" FQDN을 결정하는(시도하는) 현재 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);
}
결과는 시스템 및 파서 구성에 따라 크게 달라집니다.