UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
В терминах DNS функция
gethostbyaddrin-addr.arpa11.5. Функции getservbyname и getservbyport
Службы, как и узлы, также часто идентифицируются по именам. Используя в нашем коде имя службы вместо номера порта, при условии, что имена служб сопоставляются номерам портов в некотором файле (обычно
/etc/services/etc/servicesgetservbynameКанонический список номеров портов, назначенных определенным службам, поддерживается IANA и располагается по адресу http://www.iana.org/assignments/port-numbers (см. раздел 2.9). Файл /etc/services чаще всего содержит некоторое подмножество списка IANA.
#include <netdb.h>struct servent *getservbyname(const char *<i>servname</i>, const char *<i>protoname</i>);<i>Возвращает: непустой указатель в случае успешного выполнения, NULL в случае ошибки</i>Функция возвращает указатель на следующую структуру:
struct servent { char *s_name; /* официальное имя службы */ char **s_aliases; /* список псевдонимов */ int s_port; /* номер порта, записанный в сетевом порядке байтов */ char *s_proto; /* протокол, который нужно использовать */};Имя службы
servnameprotonameprotonameБолее всего в структуре
serventhtonsТипичные вызовы этой функции могут быть такими:
struct servent *sptr;sptr = getservbyname("domain", "udp"); /* DNS с использованием UDP */sptr = getservbyname("ftp", "tcp"); /* FTP с использованием TCP */sptr = getservbyname("ftp", NULL); /* FTP с использованием TCP */sptr = getservbyname("ftp", "udp"); /* этот вызов приведет к ошибке */Поскольку протоколом FTP поддерживается только TCP, второй и третий вызовы эквивалентны, а четвертый вызов приводит к ошибке. Вот соответствующие строки из файла
/etc/servicesfreebsd % <b>grep -e ^ftp -e ^domain /etc/services</b>ftp-data 20/tcp #File Transfer [Default Data]ftp 21/tcp #File Transfer [Control]domain 53/tcp #Domain Name Serverdomain 53/udp #Domain Name Serverftp-agent 574/tcp #FTP Software Agent Systemftp-agent 574/udp #FTP Software Agent Systemftps-data 989/tcp # ftp protocol, data, over TLS/SSLftps 990/tcp # ftp protocol, control, over TLS/SSLСледующая функция,
getservbyport#include <netdb.h>struct servent *getservbyport(int <i>port</i>, const char *<i>protname</i>);<i>Возвращает: непустой указатель в случае успешного выполнения, NULL в случае ошибки</i>Значение аргумента
portstruct servent *sptr;sptr = getservbyport(htons(53), "udp"); /* DNS с использованием UDP */sptr = getservbyport(htons(21), "tcp"); /* FTP с использованием TCP */sptr = getservbyport(htons(21), NULL); /* FTP с использованием TCP */sptr = getservbyport(htons(21), "udp"); /* этот вызов приведет к ошибке */Последний вызов оказывается неудачным, поскольку нет службы, использующей порт 21 с протоколом UDP.
Помните, что некоторые номера портов используются с TCP для одной службы, а с UDP — для совершенно другой, например:
freebsd % <b>grep 514 /etc/services</b>shell 514/tcp cmd #like exec, but automaticsyslog 514/udpЗдесь показано, что порт 514 используется командой
rshsyslogПример: использование функций gethostbyname и getservbyname
Теперь мы можем изменить код нашего TCP-клиента времени и даты, показанный в листинге 1.1, так, чтобы использовать функции
gethostbynamegetservbyname
