Протокол Finger и информация о пользователях, страница 6

Если вам понадобится протокол 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