Если вам понадобится протокол UDP, функцию getservbyname следует вызывать так:
getservbyname("echo", "UDP") ;
В этом случае getservbyname заполнит структуру данными о службе echo с протоколом UDP:
s_name[] = "echo" ;
s_aliases = NULL;
s_port = 7;
s_proto[] = "udp";
He все сетевые службы позволяют использовать оба протокола. Ftp, например, может выполняться только с протоколом TCP. Точно так же протокол TFTP (Trivial FTP, «простой протокол передачи файлов») выполняется только вместе с протоколом UDP.
Если вы внимательнее посмотрите на файл SERVICES, то увидите, что службы, работающие с обоими протоколами, сперва указаны с TCP, а затем с UDP. Поэтому, если вам не нужен именно UDP, в вызове getservbyname в качестве второго параметра можно указывать NULL. Функция, в свою очередь, всегда вернет данные о службе с протоколом TCP, если он, конечно, доступен для этой службы.
Ниже приведены образцы псевдонимов сетевых служб. Например, SMTP (Simple Mail Transfer Protocol, «простой протокол передачи почты») имеет псевдоним mail, служба time — timserver, a whois — псевдоним nicname.
#nameport/protocol aliases
#
smtp 25/tcp mail
time 37/tcp timserver
time 37/udp timserver
whois 43/tcp nicname
При вызове getservbyname все равно, что указывать — официальное имя или псевдоним. Следующие два вызова getservbyname эквивалентны:
getservbyname("smtp", NULL) ;
getservbyname("mail", NULL) ;
При этом возвращается указатель на следующую структуру:
s_name[] = "smtp" ;
s_aliases[] = "mail";
s_port =25;
s_proto[] = "tcp";
Точно так же эквивалентны два этих вызова:
lpServEnt = getservbyname("whois", NULL);
lpServEnt = getservbyname("nicname", NULL);
Оба они вернут следующие результаты:
s_name[] = "whois";
s_aliases[] = "nicname";
s_port = 43;
s_proto[] = "tcp";
База данных по сетевым службам содержит список часто встречающихся сетевых служб, таких как Ftp, Finger или Telnet. Для каждой службы задается официальный номер порта и ее транспортный протокол. Некоторые службы используют более одного протокола (TCP и UDP, например). Также в базе данных находятся псевдонимы сетевых служб.
На персональных компьютерах, как правило, база данных находится в текстовом файле SERVICES в том же каталоге, что и WINSOCK.DLL. Для доступа к базе данных необходимо вызвать функцию getservbyname.
Как показано ниже, QFinger вначале проверяет переменную lpHostEnt, указатель на структуру с информацией об удаленном компьютере. Если информация действительно получена, программа продолжает выполнение и пробует получить информацию о сетевой службе Finger, вызывая функцию getservbyname. Указатель на структуру с информацией о службе Finger хранится в переменной lpServEnt. Далее QFinger проверяет содержимое lpServEnt:
if (!lpHostEnt)
MessageBox(NULL, "Could not get IP address!",
HOST_NAME, MB_OK | MB_ICONSTOP) ;
else // Получаем информацию о службе Finger
{
lpServEnt = getservbyname("Finger", NULL) ;
if (lpServEnt == NULL)
iFingerPort = IPPORT_FINGER; // Используем официальный номер порта
else
iFingerPort = lpServEnt->s_port;
Если lpServEnt действителен (то есть не равен NULL), iFingerPort получает значение lpServEnt->s_port, то есть номера порта Finger из базы данных. Если IpServEnt равен NULL, номер порта (iFingerPort) принимается равным константе IPPORT_FINGER.
В файле winsock.h определены номера портов для чаще всего встречающихся сетевых служб, в том числе и для Finger, номер порта которого равен 79:
// Официальные номера портов различных сетевых служб
#define IPPORT_ECHO 7
#define IPPORT_DISCARD 9
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.