ГЛАВА 8. ТЕХНОЛОГИИ ОБМЕНА ИНФОРМАЦИЕЙ В ОС WINDOWS 5 глава




рес, № порта и т.д.);

sockaddrlen - размер параметра sockaddr в байтах.

Рассмотрим структуру sockaddr более подробно:

 

struct sockaddr

{

u_short sa_family;

char sa_data[14];

};

 

Первый элемент структуры обозначает протокол, второй - специфическое для про-

токола значение. Например версия данной структуры для Internet (sockaddr_in) будет

иметь следующий вид:

 

struct sockaddr_in

{

short sin_family; //AF_INET

u_short sin_port;

struct sin_addr; //4-х байтовый IP-адрес

char sin_zero[8];

};

 

Элемент sin_addr представляет собой четырехбайтовый IP-адрес (например 127.0.0.1).

Для преобразования данной строки в требуемую форму используется функция

inet_addr(), которая будет рассмотрена далее.

Для установления связи со стороны клиента используется функция connect:

 

error = connect(s, serveraddr, serveraddrlen);

 

которая инициирует установление связи на узле, используя его дескриптор s и информа-

цию из структуры serveraddr, которая содержит адрес сервера и номер порта на который

надо установить связь. Если гнездо не было связано с адресом, connect автоматически

вызовет системную функцию bind.

Функция connect возвращает 0, если вызов прошел успешно. Возвращенная вели-

чина -1 указывает на то, что в процессе установления связи произошла некая ошибка. В

случае успешного вызова функции процесс может работать с дескриптором узла, ис-

пользуя функции read и write, и закрывать канал используя функцию close.

Со стороны сервера процесс установления связи сложнее. Когда сервер желает

предложить один из своих сервисов, он связывает узел с общеизвестным адресом, ассо-

циирующимся с данным сервисом, и пассивно слушает этот узел. Для этих целей ис-

пользуется системный вызов listen:

 

error = listen(s, qlength);

 

где s это дескриптор узла, а qlength это максимальное количество запросов на установ-

ление связи, которые могут стоять в очереди, ожидая обработки сервером; это количест-

во может быть ограничено особенностями системы.

 

 


 

 

Когда сервер получает запрос от клиента и принимает решение об установлении

связи, он создает новый узел и связывает его с ассоциацией, эквивалентной "узлу в ре-

жиме ожидания". Для Internet домена это означает тот же самый номер порта. Для этой

цели используется системный вызов accept:

 

newsock = accept(s, clientaddr, clientaddrlen);

 

Узел, ассоциированный клиентом, и узел, который был возвращен функцией

accept, используются для установления связи между сервером и клиентом.

Когда связь установлена, с помощью различных функций может начаться процесс

передачи данных. При наличии связи, пользователь может посылать и получать сообще-

ния с помощью функций read и write:

 

write(s, buf, sizeof(buf));

read(s, buf, sizeof(buf));

 

Вызовы send и recv практически идентичны read и write, за исключением того, что

добавляется аргумент флагов.

 

send(s, buf, sizeof(buf), flags);

recv(s, buf, sizeof(buf), flags);

 

Могут быть указаны один или более флагов с помощью ненулевых значений, таких, как

следующие:

MSG_OOB - Посылать/получать данные, характерные для гнезд типа stream.

MSG_PEEK - Просматривать данные без чтения. В этом случае данные посылаются

пользователю, но сами помечаются как "непрочитанные". Следующий read или recv

вызванный на данном узле вернет прочитанные в прошлый раз данные.

MSG_DONTROUTE - посылать данные без маршрутизации пакетов. (Используется

только процессами, управляющими таблицами маршрутизации.)

Закрытие узла производится следующим образом. Если узел больше не использу-

ется, процесс может закрыть его с помощью функции close, вызвав ее с соответствую-

щим дескриптором узла:

 

close(s);

 

Если данные были ассоциированы с узлом, обещающим доставку (тип stream), сис-

тема будет пытаться осуществить передачу этих данных. Тем не менее, по истечении

довольно длительного промежутка времени, если данные все еще не доставлены, они

будут отброшены. Если пользовательский процесс желает немедленно прекратить лю-

бую передачу данных, он может сделать это с помощью вызова shutdown на данном узле

для его закрытия. Формат вызова следующий [12]:

 

shutdown(s, how);

где how имеет одно из следующих значений:

• 0 - если пользователь больше не желает читать данные

• 1 - если данные больше не будут посылаться

• 2 - если данные не будут ни посылаться ни получаться

Функциипреобразованияданных. Другой набор функций интерфейса Winsock

связан с преобразованием данных из Сетевого формата в формат базового компьютера и

в обратном направлении (табл.8.2). Эти функции рекомендуется применять даже в том

 

 


 

случае, если формат данных одинаков на обоих компьютерах, поскольку они делают

программный код хорошо совместимым и легко переносимым.

 

Таблица 8.2


Функция

htonl

htons

inet_addr

inet_ntoa

 

ntohl

ntohs


Во что преобразует

32-разрядное значение из базового формата в сетевой формат TCP/IP

16-разрядное значение из базового формата в сетевой формат TCP/IP

Строку IP-адреса с точками в длинное целое без знака

Сетевой адрес, представленный в виде длинного целого без знака, в

строку IP-адреса с точками

32-разрядное значение из сетевого формата TCP/IP в базовый формат

16-разрядное значение из сетевого формата TCP/IP в базовый формат


 

Функциипросмотрабазданных. Другой, меньший набор функций интерфейса

Winsock состоит из функций просмотра баз данных. Эти функции (их список приведен в

табл.8.3) предназначены для поиска IP-адресов, доменных имен, идентификаторов сер-

висов и номеров портов протоколов. Функции просмотра баз данных во многом работа-

ют подобно своим Unix-аналогам. На каждом базовом компьютере содержится инфор-

мация о сервисах и, как правило, небольшой список доменных имен и IP-адресов. Эти

данные обычно записываются в два текстовых файла, а именно HOSTS и SERVICES, и

функции работы с гнездами используют их в качестве исходной информации об адресах

или номерах сервисов.

Таблица 8.3


Функция

gethostbyaddr

gethostbyname

gethostname

getpeername

getprotobyname


Что возвращает

Информацию о базовом компьютере по заданному адресу

Информацию о базовом компьютере по заданному имени узла

Стандартное базовое имя локального компьютера

Адрес однорангового узла, подключенного к заданному гнезду

Информацию о заданном протоколе (по его имени)


getprotobynumber Информацию о протоколе


getservbyname

getservbyport

getsockname

getsockopt


Информацию о сервисе по заданному имени сервиса и протоколу

Информацию о сервисе по заданному имени, порта и протоколу

Локальное имя заданного гнезда

Текущее значение указанного параметра гнезда


 

Независимо от операционной системы, под управлением которой работает компь-

ютер (Windows 98, Windows NT или Unix), файл HOSTS содержит базовые адреса и

имена компьютеров, приведенные попарно, а файл SERVICES хранит информацию о

"популярных" сервисах, в том числе соответствующие номера портов, перечень исполь-

зуемых низкоуровневых протоколов и необязательные псевдонимы. В Windows 98 эти

файлы находятся в папке \WINDOWS, а в Windows NT - в папке

\WINNT\SYSTEM32\DRIVERS\ETC.

Ниже приведен фрагмент стандартного файла SERVICES, заимствованного с рабо-

чей станции Windows. Обратите внимание, что в каждой записи указано имя сервиса,

номер порта и тип протокола, а также один или несколько дополнительных (необяза-

тельных) псевдонимов [12].

 

# Copyright (с) 1993-1995 Microsoft Corp. #

# Этот файл содержит номера портов для популярных сервисов, заданных

# в соответствии со стандартом RFC 1060

#

 



 

 

# Формат:

#

# <имя сервиса> <номер порта>/<протокол> [псевдонимы...] [#<комментарий>] #

echo 7/tcp

echo 7/udp

discard 9/tcp sink null

discard 9/udp sink null

systat 11/tcp

systat 11/tcp users

daytime 13/ftcp

daytime 13/udp

netstat 15/tcp

qotd 17/top quote

qotd 17/udp quote

chargen 19/tcp ttytst source

chargen 19/udp ttytst source

ftp-data 20/tcp

ftp 21/tcp

telnet 23/tcp

amtp 25/tcp mail

time 37/tcp timserver

time 37/udp timserver

rip 39/udp resource

name 42/tcp nameserver

name 42/udp nameserver

whois 43/tcp nicname

domain 53/tcp nameserver # сервер доменных имен

domain 53/udp nameserver

nameserver 53/tcp domain # сервер доменных имен

nameserver 53/udp domain

mtp 57/tcp # использовать не рекомендуется

bootp 67/udp # сервер программы загрузки

tftp 69/udp

rje 77/tcp netrjs

finger 79/tcp

link 87/tcp ttylink,

supdup 95/tcp

hostnames 101/tcp hostname

iso-tsap 102/tcp

dictionary 103/tcp webster

x400 103/tcp # ISO-почта

x400-snd 104/tcp

csnet-ns 105/tcp

pop 109/tcp postoffice

pop2 109/tcp # почтовая служба

pop3 110/tcp postoffice

 

Ниже представлен пример типичного содержимого файла HOSTS. Этот файл

обычно имеет сравнительно малый размер, поскольку большая часть имен переносится

на сервер DNS (сервер доменных имен).

 


 

# Файл HOSTS, используемый в TCP/IP

102.54.94.97 rhino.acme.com # исходный сервер

38.25.63.10 х.acme.corn # сервер клиента х

127.0.0.1 localhost

 

В этом файле каждый IP-адрес соответствует имени базового компьютера. Обрати-

те внимание на стандартный адрес 127.0.0.1, соответствующий локальному базовому

компьютеру. (Согласно общепринятой договоренности, адрес 127.0.0.1 всегда указывает

на сам локальный базовый компьютер.) В современных Windows обычно еще имеется

файл LMHOSTS. Он служит для тех же целей, что и файл HOSTS, однако заданные

здесь базовые имена являются NetBIOS-именами. Кроме того, в этом файле могут ис-

пользоваться ключевые слова, не применяемые в файле HOSTS (например, ключевое

слово #DOM позволяет задать контролер домена сети Windows NT).

Иногда поиск адреса сводится к простому просмотру соответствующей записи в

файле HOSTS, но чаще всего поисковый запрос передается на DNS-сервер, который ли-

бо удовлетворяет этот запрос, либо передает его дальше, DNS-серверу первого уровня.

Если искомая запись не обнаружена на сервере первого уровня, запрос передается сле-

дующему по иерархии DNS-серверу. Этот процесс продолжается до тех пор, пока иско-

мая запись не будет обнаружена или пока не закончится процесс поиска (в последнем

случае появится сообщение об ошибке).

Асинхронныеверсиифункцийинтерфейса Winsock. Для программирования

асинхронных гнезд в Windows рекомендуется использовать WSA-версии функций рабо-

ты с гнездами, которые в качестве параметра обычно принимают значение дескриптора

окна и по окончании выполнения (или при необходимости передачи информации при-

ложению) записывают в очередь сообщений этого окна данные о статусе операции или

сообщение о завершении ее выполнения. Поскольку Windows поддерживает одновре-

менную работу нескольких потоков, можно также использовать синхронные функции,

создавая для них отдельный поток и освобождая основное приложение для обработки

других задач на время выполнения этих функций. Список асинхронных функций приве-

ден в табл.8.4 [12].

Таблица 8.4


 

 

WSAAccept


Функция


Выполняемое действие

В зависимости от определенных условий регист-

рирует соединение и создает группу гнезд или

подключается к существующей группе


WSAAddressToString

 

 

WSAAsyncGetHostByAddr

 

WSAAsyncGetHostByName

 

WSAAsyncGetProtoByName

 

WSAAsyncGetProtoByNumber

 

 

WSAAsyncGetServByName


Преобразует все адреса, содержащиеся в струк-

туре SOCKADDR, в представление, удобное для

восприятия человеком

Получает информацию о базовом компьютере по

заданному адресу

Получает информацию о базовом компьютере по

заданному имени

Получает информацию о заданном протоколе по

его имени

Получает информацию о заданном протоколе по

его номеру

Продолжение табл. 8.4

Получает информацию о сервисе по заданному

имени сервиса и протоколу

 

 





Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: