получение доменного имени по коду в Linux - PullRequest
1 голос
/ 27 августа 2010

Я использую getdomainname () и gethostbyname (), чтобы попытаться получить домен компьютера, чтобы я мог показать правильную информацию о моей программе. Однако иногда эти функции не возвращают правильную информацию.

Есть ли другой способ (в простом C) получить доменное имя в Linux?

Редактировать: просто чтобы было немного понятнее: я хочу проверить, является ли компьютер частью домена. Если это так, получите доменное имя.
В настоящее время я использую функции, упомянутые выше. Есть ли другие?

@ unwind: пожалуйста, НЕ редактируйте этот вопрос для краткости, если я хотел бы сказать спасибо Я скажу спасибо.

Спасибо!

Ответы [ 3 ]

1 голос
/ 27 августа 2010

Если вы хотите получить доменное имя (Интернет), есть определенные проблемы, о которых вам нужно подумать.

У компьютера может быть несколько сетевых интерфейсов, фактически он почти наверняка имеет как минимум два, включая loopbackинтерфейс.Каждый интерфейс имеет IP-адрес (возможно, более одного), и каждый IP-адрес может быть сопоставлен с любым количеством DNS-имен и записей в файле hosts.

Так что, если любое из множества возможных доменных именто, что возвращает getdomainname (), зависит от целого ряда проблем конфигурации.например, какой IP-адрес настроен в качестве основного адреса, используется ли файл хостов предпочтительнее DNS, правильно ли настроен файл хостов, есть ли у IP-адреса набор обратного просмотра и много других проблем.

Например, довольно часто неправильно настраивают файл hosts.Если вы видите в нем запись вроде:

192.168.1.1  foohost foohost.example.com

, то это неправильно.Имя хоста first в строке - это каноническое имя (для интерфейса), а последующие записи - просто псевдонимы.Если вы хотите, чтобы домен представлял собой example.com, а не ничего, он должен выглядеть следующим образом:

192.168.1.1  foohost.example.com foohost

Кроме того, каждый IP-адрес в Интернете в идеале должен иметь запись обратного просмотра в DNS, котораясопоставляет IP-адрес с именем хоста и доменом.Тем не менее, не существует правила, чтобы сказать, что должен существовать или что это должен быть домен, на котором вы указали SSH или указали в своем веб-браузере.

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

0 голосов
/ 27 августа 2010

К сожалению, эта информация не всегда установлена ​​правильно.Прежде всего, пожалуйтесь своему системному администратору.

Если все это дает сбой, с помощью чего-то подобного следующему вы можете получить поле res->ai_canonname с каноническим именем хоста, а затем выполнить итерацию по всем IP-адресам:

struct addrinfo *res = NULL;
struct addrinfo hints = {
   .ai_family = AF_UNSPEC,
   .ai_flags = AI_V4MAPPED | AI_ADDRCONFIG | AI_CANONNAME | (name ? 0 : AI_PASSIVE),
    .ai_socktype = SOCK_STREAM,
};
getaddrinfo(name, NULL, &hints, &res);
for (struct addrinfo *p = res; p; p = p->ai_next) {
 ...
}

Тогда вы быкаким-то образом нужно выбрать, какие из них вам интересны (избегать зацикливания и т. д.) и попытаться найти имя хоста, соответствующее одному из этих IP-адресов.Но поскольку IP-адреса не обязательно соответствуют действительному имени хоста, это также может привести к сбою.

0 голосов
/ 27 августа 2010

Чтобы получить имя хоста компьютера, на котором вы запускаете программу:

  • uname
  • / и т.д. / имя хоста
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...