programing

C(호스트 이름 및 도메인 정보)에서 현재 시스템의 전체 호스트 이름을 확인하려면 어떻게 해야 합니까?

starjava 2023. 10. 24. 20:03
반응형

C(호스트 이름 및 도메인 정보)에서 현재 시스템의 전체 호스트 이름을 확인하려면 어떻게 해야 합니까?

C 프로젝트(POSIX)에서 현재 시스템의 완전한 이름을 얻으려면 어떻게 해야 합니까?

예를 들어, 나는 내 기계의 호스트 이름만 얻을 수 있습니다.gethostname()대학시절부터이럴 수도 있어요machine3그 답례로, 하지만 사실은 그들이machine3.somedomain.com예를들면.

이 정보를 얻으려면 어떻게 해야 합니까?가능하면 시스템()에 대한 호출을 사용하여 이 작업을 수행하고 싶지 않습니다.

시스템에 대한 완전한 정규화된 이름을 얻으려면 먼저 로컬 호스트 이름을 가져온 다음 표준 이름을 검색해야 합니다.

가장 쉬운 방법은 먼저 다음을 사용하여 로컬 호스트 이름을 얻는 것입니다.uname()아니면gethostname()다음으로 검색을 수행할 수 있습니다.gethostbyname()그리고 그것을 보면서.h_name반환되는 구조의 멤버입니다.ANSIc를 사용하는 경우 다음을 사용해야 합니다.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()현재 POSIX 사양에서는 IPv6로 잘 재생되지 않기 때문에 더 이상 사용되지 않습니다.이 코드의 더 현대적인 버전은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 방법은 없습니다.

당신이 찾고 있는 것은 다음과 같습니다.

주소별 호스트 가져오기

로컬 호스트 IP만 전달하면 됩니다.

gethost by name 기능도 있어 유용합니다.

쉬운 방법, try unname()

이 방법이 작동하지 않으면 gethostname()을 사용한 다음 gethostbyname()을 사용하고 마지막으로 gethostbyname()을 사용하여 addr()을 사용합니다.

hostent{}의 h_name은 FQDN이어야 합니다.

언급URL : https://stackoverflow.com/questions/504810/how-do-i-find-the-current-machines-full-hostname-in-c-hostname-and-domain-info

반응형