Сетевые узлы на уровень ниже корневого представляют собой так называемые
Когда-то существовало всего семь общих доменов верхнего уровня, большинство из которых считались международными. На рис. 55.2 показаны четыре из них. Оставшиеся три — int, mil и gov; два последних зарезервированы для правительства США. Сравнительно недавно количество ДВУ расширилось (появились такие домены, как info, name и museum).
Каждая страна имеет национальный домен верхнего уровня, соответствующий стандарту ISO 3166-1 и состоящий из двух символов. Несколько из них показано на рис. 55.2: de (Германия,
Как отмечалось в подразделе 54.6.1, учетом общеизвестных номеров портов занимается организация IANA. У каждого порта есть соответствующее
Каждая строка в файле /etc/services состоит из трех полей:
# Service name port/protocol [aliases]
echo 7/tcp Echo # echo service
echo 7/udp Echo
ssh 22/tcp # Secure Shell
ssh 22/udp
telnet 23/tcp # Telnet
telnet 23/udp
smtp 25/tcp # Simple Mail Transfer Protocol
smtp 25/udp
domain 53/tcp # Domain Name Server
domain 53/udp
http 80/tcp # Hypertext Transfer Protocol
http 80/udp
ntp 123/tcp # Network Time Protocol
ntp 123/udp
login 513/tcp # rlogin(1)
who 513/udp # rwho(1)
shell 514/tcp # rsh(1)
syslog 514/udp # syslog
Поле protocol обычно содержит либо tcp, либо udp. У службы также могут быть псевдонимы (aliases), разделяемые пробелами. Помимо вышеперечисленного строка может содержать комментарий, начинающийся с символа #.
Как уже отмечалось ранее, в протоколах UDP и TCP номер порта обозначает разные сущности, но, согласно политике IANA, в обоих случаях номер порта привязывается к одной и той же службе, даже если она использует только один из протоколов. Например, службы telnet, ssh, HTTP и SMTP работают поверх TCP, но им также выделен и соответствующий UDP-порт. Аналогично служба NTP задействует только UDP, но в ее распоряжении также находится TCP-порт 123. В отдельных случаях служба может работать с обоими протоколами, например DNS и echo. Наконец, существуют редкие примеры того, как один порт в UDP и TCP привязан к разным службам. Среди них можно выделить порт 514, который в протоколе TCP отводится для службы rsh, а в TCP — для демона syslog (см. раздел 37.5). Дело в том, что указанные номера портов были распределены еще до того, как вступили в силу современные правила IANA.
Файл /etc/services содержит записи, связывающие номера с именами. Это не механизм резервирования: наличие в данном файле номера порта не гарантирует, что его можно будет привязать к конкретной службе.
Функция getaddrinfo() переводит имена узлов и служб в IP-адреса и номера портов. Она была добавлена в стандарт POSIX.1g в качестве (реентерабельной) замены устаревшим функциям gethostbyname() и getservbyname() (использование getaddrinfo() вместо gethostbyname() позволяет не беспокоиться о том, с какой версией протокола IP работает наша программа).
Функция getnameinfo() выполняет обратную операцию. Она переводит структуру с адресом сокета (IPv4 или IPv6) в строку, содержащую имена соответствующих узла и службы. Эта функция является (реентерабельным) аналогом устаревших функций gethostbyaddr() и getservbyport().
Подробное описание функций getaddrinfo() и getnameinfo(), а также детали их реализации представлены в главе 11 книги [Stevens et al., 2004]. Кроме того, они описаны в документе RFC 3493.
55.10.1. Функция getaddrinfo()
Если передать функции getaddrinfo() имена узла и службы, то она вернет список структур с адресами сокетов, каждая из которых содержит IP-адрес и номер порта.
#include
#include
int getaddrinfo(const char *
const struct addrinfo *
Возвращает 0 при успешном завершении или ненулевое значение при ошибке