C (호스트 이름 및 도메인 정보)에서 현재 컴퓨터의 전체 호스트 이름을 어떻게 찾습니까?
-
21-08-2019 - |
문제
C 프로젝트 (POSIX)에서 현재 시스템의 자격을 갖춘 이름을 어떻게 얻습니까?
예를 들어, 나는 내 컴퓨터의 호스트 이름 만 얻을 수 있습니다.gethostname()
Unistd.h에서. 이것은 나에게 줄 수 있습니다 machine3
그 대가로, 그러나 나는 실제로 찾고 있습니다 machine3.somedomain.com
예를 들어.
이 정보를 얻는 방법은 무엇입니까? 가능한 경우 System ()에 대한 호출을 사용하고 싶지 않습니다.
해결책
기계의 자격을 갖춘 이름을 얻으려면 먼저 로컬 호스트 이름을 가져온 다음 표준 이름을 조회해야합니다.
이 작업을 수행하는 가장 쉬운 방법은 먼저 로컬 호스트 이름을 사용하는 것입니다. uname()
또는 gethostname()
그런 다음 조회를 수행합니다 gethostbyname()
그리고 h_name
구조물의 구성원이 돌아옵니다. ANSI C를 사용하는 경우 ~ 해야 하다 사용 uname()
대신에 gethostname()
.
예시:
char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
printf("Hostname: %s\n", hostname);
struct hostent* h;
h = gethostbyname(hostname);
printf("h_name: %s\n", h->h_name);
안타깝게도, gethostbyname()
IPv6에서는 잘 작동하지 않으므로 현재 POSIX 사양에서는 더 이상 사용되지 않습니다. 이 코드의보다 현대적인 버전은 사용할 것입니다 getaddrinfo()
.
예시:
struct addrinfo hints, *info, *p;
int gai_result;
char hostname[1024];
hostname[1023] = '\0';
gethostname(hostname, 1023);
memset(&hints, 0, sizeof hints);
hints.ai_family = AF_UNSPEC; /*either IPV4 or IPV6*/
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_CANONNAME;
if ((gai_result = getaddrinfo(hostname, "http", &hints, &info)) != 0) {
fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(gai_result));
exit(1);
}
for(p = info; p != NULL; p = p->ai_next) {
printf("hostname: %s\n", p->ai_canonname);
}
freeaddrinfo(info);
물론, 이것은 기계에 fqdn이있는 경우에만 작동합니다. getaddrinfo()
결국 자격이없는 호스트 이름과 동일하게됩니다.
다른 팁
내 해결책 :
#ifdef WIN32
#include <Windows.h>
#include <tchar.h>
#else
#include <unistd.h>
#endif
void GetMachineName(char machineName[150])
{
char Name[150];
int i=0;
#ifdef WIN32
TCHAR infoBuf[150];
DWORD bufCharCount = 150;
memset(Name, 0, 150);
if( GetComputerName( infoBuf, &bufCharCount ) )
{
for(i=0; i<150; i++)
{
Name[i] = infoBuf[i];
}
}
else
{
strcpy(Name, "Unknown_Host_Name");
}
#else
memset(Name, 0, 150);
gethostname(Name, 150);
#endif
strncpy(machineName,Name, 150);
}
gethostname()
로컬 호스트 이름을 얻는 POSIX 방법입니다. 체크 아웃 man
.
BSD 기능 getdomainname()
완전히 자격을 갖춘 호스트 이름을 빌드 할 수 있도록 도메인 이름을 제공 할 수 있습니다. 내가 두려워하는 도메인을 얻는 posix 방법은 없습니다.
쉬운 방법, uname () 시도
작동하지 않으면 gethostname ()을 사용한 다음 gethostbyname ()을 사용하고 마지막으로 gethostbyaddr ()
호스트의 h_name {}는 당신의 fqdn이어야합니다.