Jak znaleźć pełną nazwę hosta bieżącego komputera w C (Nazwa hosta i informacje o domenie)?
W projekcie C (POSIX), jak uzyskać w pełni kwalifikowaną nazwę dla bieżącego systemu?
Na przykład, mogę uzyskać tylko nazwę hosta mojego komputera, wykonując
gethostname()
od unistd.h. to może dać mi machine3
w zamian, ale tak naprawdę Szukam machine3.somedomain.com
na przykład.
5 answers
Aby uzyskać w pełni kwalifikowaną nazwę maszyny, musimy najpierw pobrać lokalną nazwę hosta, a następnie wyszukać nazwę kanoniczną.
Najprostszym sposobem na to jest najpierw pobranie lokalnej nazwy hosta za pomocą uname()
lub gethostname()
, a następnie wykonanie wyszukiwania za pomocą gethostbyname()
i przyjrzenie się elementowi h_name
zwracanej struktury. Jeśli używasz ANSI c, musisz używać uname()
zamiast gethostname()
.
Przykład:
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);
Niestety, {[4] } jest przestarzałe w bieżącym POSIX Specyfikacja, ponieważ nie gra dobrze z IPv6. Bardziej nowoczesna wersja tego kodu używałaby getaddrinfo()
.
Przykład:
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);
Oczywiście będzie to działać tylko wtedy, gdy maszyna ma FQDN do podania-jeśli nie, wynik getaddrinfo()
będzie taki sam jak niekwalifikowana Nazwa hosta.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-26 11:43:51
Moje rozwiązanie:
#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);
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-20 12:59:12
gethostname()
jest sposobem POSIX na uzyskanie nazwy lokalnego hosta. Zobacz man
.
Funkcja BSD getdomainname()
może dać Ci nazwę domeny, dzięki czemu możesz zbudować w pełni kwalifikowaną nazwę hosta. Obawiam się, że nie ma sposobu na uzyskanie domeny przez POSIX.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 21:40:14
Myślę, że szukasz:
Po prostu podaj adres IP localhost.
Istnieje również funkcja gethostbyname, która jest również przydatna.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 20:50:34
Prosty sposób, spróbuj uname ()
Jeśli to nie zadziała, użyj gethostname (), następnie gethostbyname () i wreszcie gethostbyaddr ()
H_name of hostent {} powinien być twoim FQDN
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-02 20:49:36