C (호스트 이름 및 도메인 정보)에서 현재 컴퓨터의 전체 호스트 이름을 어떻게 찾습니까?

StackOverflow https://stackoverflow.com/questions/504810

  •  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 방법은 없습니다.

나는 당신이 찾고 있다고 생각합니다.

gethostbyaddress

로컬 호스트 IP를 전달하십시오.

gethostbyname 함수도 있습니다.

쉬운 방법, uname () 시도

작동하지 않으면 gethostname ()을 사용한 다음 gethostbyname ()을 사용하고 마지막으로 gethostbyaddr ()

호스트의 h_name {}는 당신의 fqdn이어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top