posix 7호가 제거되었으므로 더 이상 내 컴퓨터의 정식 호스트 이름을 얻을 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
현재 호스트의 "표준" 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);
}
결과는 시스템 및 해석기 구성에 따라 크게 달라집니다.