Как я нахожу полное имя узла текущей машины в C (имя узла и доменная информация)?

Создание экземпляра шаблона может выводить только его параметры из аргументов в заданный шаблонный объект (функция в этом случае), так что нет, тип переменной не имеет значения при выводе, и вам либо нужно предоставить фиктивный аргумент типа T функции или

Существует возможное обходное решение с использованием вывода типа, представленного в комментариях:

#include 

namespace byte_read {
    //this is a hack to deduce the type using implicit conversion
    struct type_converter {
        const char* buffer;

        template
            operator T() {
            std::cout << "implicit convertion from " << typeid(buffer).name() 
                << " to " << typeid(T).name() << std::endl;
            //casting memory to the desired type
            return static_cast(*buffer);
        }
    };
    type_converter getValue(const char * buffer) {
        //here buffer is implicitly converted to T type using the operator T()
        return {buffer};
    }

}
using namespace byte_read;

int main()
{
    char buffer[]{0,1,0,0 //int 256 encoded
                  ,97      //char 'a' encoded
                 };
    //pointer to read the buffer sequentialy
    char* pos = buffer;
    //pointer used to count the bytes readed
    char* last_pos = pos;

    int int_256 = getValue(pos);
    pos+=sizeof(int);
    std::cout << int_256 << " bytes readed :" << pos - last_pos << std::endl;

    last_pos = pos;
    char char_a = getValue(pos);
    pos+=sizeof(char);
    std::cout << char_a << " bytes readed :" << pos - last_pos << std::endl;

}

Вы можете попробуйте здесь

29
задан Zxaos 2 February 2009 в 20:44
поделиться

4 ответа

Для получения полностью определенного названия машины мы должны сначала получить локальное имя хоста и затем поиск каноническое имя.

самый легкий способ сделать это первым получением локального имени хоста с помощью 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() удерживается от использования в текущей спецификации 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() заканчивает тем, что совпал с неполным именем хоста.

51
ответ дан vdm 14 October 2019 в 07:49
поделиться

gethostname() POSIX способ получить локальное имя хоста. Выезд man.

функция BSD getdomainname() может дать Вам доменное имя, таким образом, можно создать полностью определенное имя хоста. Нет никакого POSIX способа получить домен, я боюсь.

2
ответ дан qrdl 14 October 2019 в 07:49
поделиться

Я полагаю, что Вы ищете:

gethostbyaddress

Просто передают его localhost IP.

существует также функция gethostbyname, которая также полезна.

0
ответ дан Alex 14 October 2019 в 07:49
поделиться

Простой способ, попробуйте uname ()

, Если это не работает, используйте gethostname () затем gethostbyname () и наконец gethostbyaddr ()

, h_name hostent {} должен быть Вашим FQDN

-1
ответ дан Jack L. 14 October 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: