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

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

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

결과는 시스템 및 해석기 구성에 따라 크게 달라집니다.

관련 정보