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

char FAR * s_proto;

};

Элементы структуры заполняются при вызове функции getservbyname. Вот ее прототип:

struct servent FAR * PASCAL FAR getservbyname(const char FAR * name,

const char FAR * proto) ;

В табл. 2 приведены описания элементов структуры servent.

Таблица 10.2.

Элементы структуры, содержащей информацию о сетевой службе

Элемент

Описание

s_name s_aliases s_port

s_proto

Официальное название службы, например Finger. Список псевдонимов данной сетевой службы. Номер порта протокола данной службы, равный 79 для Finger.

Название протокола, работающего с этой службой, например TCP илиUDP.

При вызове функции getservbyname указываются два параметра — указатель на имя службы и указатель на название протокола. Указатель на название протокола может равняться NULL. В этом случае будет выбран протокол по умолчанию. В случае QFinger первый параметр указывает на строку «finger», а второй равен NULL — программе нужен стандартный протокол.

Функция getservbyname исследует базу данных с информацией о сетевых службах. На персональных компьютерах это обычно ASCII-файл под названием SERVICES. Его фрагмент приводится ниже. Файл состоит из трех колонок. Первая содержит наименование сетевой службы, вторая определяет номер порта и протокол, а в третьей приведены соответствующие службе псевдонимы:

# Network services. Internet style

#

#name   port/protocol    aliases

#

echo           7/tcp

echo           7/udp

discard        9/tcp      sink null

discard        9/udp      sink null

systat         11/tcp     users

day time        13/tcp

daytime        13/udp

netstat        15/tcp

qotd           17/tcp     quote

chargen        19/tcp     ttytst source

chargen        19/udp     ttytst source

ftp            21/tcp

telnet         23/tcp

smtp           25/tcp    mail

time           37/tcp     timserver

time           37/udp     timserver

rip            39/udp     resource        # resource location

nameserver     42/tcp    name            # IEN 116

whois          43/tcp     nicname

domain         53/tcp     nameserver      # name-domain

server

domain         53/udp     nameserver

mtp            57/tcp                     # deprecated

tftp           69/udp

rje            77/tcp     netrjs

finger         79/tcp

link           87/tcp     ttylink

supdup         95/tcp

hostnames      101/tcp    hostname        # usually from

sri-nic

ns             105/tcp                    # ph name server

pop2           109/tcp    postoffice2

pop3           110/tcp    postoffice

sunrpc         111/tcp    portmapper

sunrpc         111/udp    portmapper

auth           113/tcp    authentication

sftp           115/tcp

uucp-path      117/tcp

nntp           119/tcp    readnews untp

# USENET News Transfer Protocol

Примечание: Спецификация Winsock не затрагивает вопросов, касающихся базы данных по сетевым службам. На персональных компьютерах, однако, база данных чаще всего хранится в виде текстового файла SERVICES, находящегося в том же каталоге, что и WINSOCK.DLL

Рассмотрим первые две записи файла SERVICES. Вы видите, что служба echo с официальным номером порта 7 может использоваться как с протоколом TCP, так и с протоколом UDP. Служба или сервер echo просто возвращает все выданные клиентом данные обратно в том же виде. Предположим, что мы вызвали getservbyname со следующими аргументами:

getservbyname("echo", NULL) ;

getservbyname обратится к файлу SERVICES и найдет в нем первую строчку с именем echo (с протоколом TCP). Структура информации о сетевой службе после вызова будет содержать следующие элементы:

s_name[] = "echo" ;

s_aliases = NULL;

s_port = 7 ;

s_proto[] = "tcp";