質問

Cプロジェクト(POSIX)、どのように完全修飾名に制限はありますか。

例えば、できるだけのホスト名のマシンによって gethostname() からunistd.hです。こうい machine3 見返りがいを見つ machine3.somedomain.com ります。

ただしっこす。私は利用しない呼び出しシステム()この場合、可能です。

役に立ちましたか?

解決

マシンの完全修飾名を取得するには、まずローカルホスト名を取得し、その後、正規名を検索する必要があります。

これを行う最も簡単な方法は、最初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);
それはIPv6でうまく再生されないように、

残念ながら、gethostbyname()は、現在の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);
そうでない場合は、getaddrinfo()の結果が非修飾ホスト名と同じなってしまう。

-

もちろん、これは唯一のマシンが与えるFQDNを持っている場合に動作します。

他のヒント

私の解決策ます:

#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のhostent{}きFQDN

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top