Cプロジェクト(POSIX)で、現在のシステムの完全修飾名を取得するにはどうすればよいですか?
たとえば、unistd.hからgethostname()
を実行することで、マシンのホスト名だけを取得できます。これは私にmachine3
は見返りですが、実際に探しているのはmachine3.somedomain.com
例えば。
この情報を取得するにはどうすればよいですか?可能であれば、これを行うためにsystem()の呼び出しを使用したくありません。
マシンの完全修飾名を取得するには、最初にローカルホスト名を取得してから、正規名を検索する必要があります。
これを行う最も簡単な方法は、最初にuname()
またはgethostname()
を使用してローカルホスト名を取得し、次にgethostbyname()
でルックアップを実行し、h_name
メンバーを見て返す構造体。 ANSI cを使用している場合、mustuname()
の代わりに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の方法はありません。