LINUX.ORG.RU

Не резолвит имя сервера.

 , ,


0

1

При попытке подключится к самописному простому эхо-серверу с самописного клиента - getaddrinfo() возвращает ошибку «Temporary failure in name resolution».

Сервер запускается без проблем, порт слушает (проверял с помощью netstat -tulp). Примечание: клиент запускаю из одного терминала, сервер ждёт в другом.

Т.е. я запускаю клиент и передаю программе аргумент «httpd» (так назвал программу-сервер) ‘./httpc httpd’. Я так понимаю, что проблема в том, что система не находит никакой адрес, связанный с таким символьным именем. Зато когда в аргументе ‘./httpc localhost’ - подключается и всё работает исправно. Почему работает с ‘localhost’ я понимаю, сервер стоит на этой машине, но могу ли я обратиться к серверу по имени, а не вписывая аналог ‘127.0.0.1’.

Я совсем зелёный и чувствую, что не до конца понимаю, как это работает. Может ли кто-нибудь объяснить, в чём тут может быть дело? И должно ли оно вообще так работать как я хочу?

Название программы-сервера ни на что не влияет. Сопоставление имени с айпи-адресом происходит либо по строчке в файле /etc/hosts (только на том компе где эта строчка есть), либо прописыванием аналогичной записи в глобальную систему доменных имён (если хочешь чтобы видел не только ты - для этого домен надо сначала купить у регистратора и найти себе хостинг днс сервера).

Или, другими словами: само по себе оно твой сервер не найдёт, ты так или иначе должен где-то вручную прописать соответствие «имя -> айпи-адрес». Где и как - есть варианты, в зависимости от того, кто должен это соответствие тоже увидеть.

firkax ★★★ ()
Последнее исправление: firkax (всего исправлений: 2)

И должно ли оно вообще так работать как я хочу?

Что-то похожее на твои хотелки можно сделать через Unix domain socket, при условии работы клиента и сервера на одном хосте.

vvn_black ★★★★★ ()
Ответ на: комментарий от firkax

Это все правильно, но раз человек интересуется написанием клиентов и серверов, неплохо бы изучить, как работает DNS. Можно по Танненбауму. Можно по Олиферам.

Bagrov ★★★★★ ()

Спасибо большое всем за разъяснения и советы! С вашей помощью собрал те части паззла в своей голове, что были необходимы.

pelmenAI ()

IP и сетевые имена — общесистемные, они не принадлежат какому-то одному процессу. Значение для localhost прописано в файле /etc/hosts, в который ты можешь добавлять любые свои ассоциации (почитай man hosts). Этот файл имеет приоритет перед DNS.

В файле /etc/resolv.conf прописываются IP-адреса серверов имён DNS, к которым обращается твоя система, когда хочет узнать IP, соответствующий заданному имени (man resolv.conf). Обычно там записан (при помощи DHCP) адрес DNS-сервера твоего провайдера, либо маршрутизатора, который обычно просто транслирует запросы тому же провайдеру. В этот файл ты тоже можешь записать IP-адрес любого другого сервера, какого пожелаешь, хоть локального, хоть глобального. (Неплохой список публичных серверов выдаёт DuckDuckGo, по запросу dns server.) Если у тебя настроен DHCP, то запись сохранится только до перезагрузки ПК.

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

Узнать IP и порт слушающего процесса на локальной машине можно через те же ss и netstat, либо через procfs (man procfs), если известен PID процесса:

$ pgrep -o httpd
5908

$ readlink /proc/5908/fd/* | grep socket
socket:[74763]

$ (head -1; grep 74763) < /proc/net/tcp
  sl  local_address rem_address   st ... inode ...
   4: 0100007F:22B8 00000000:0000 0A ... 74763 ...

В примере, вторая колонка (local_address) — адрес, который слушает процесс, в hex-формате, 127.0.0.1:8888. Для IP используется «сетевой» порядок следования байтов — big endian — когда старший байт числа записывается последним (7f = 127).

anonymous ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.