POSIX 2018에서 내 FQDN을 쿼리하는 방법

POSIX 2018에서 내 FQDN을 쿼리하는 방법

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);
}

결과는 시스템 및 파서 구성에 따라 크게 달라집니다.

관련 정보