Имя Пароль
Зарегистрироваться


* При перепечатке материалов ссылка на www.SeoLiga.ru обязательна! RSS



Информация о протоколе
19 марта 2009

В предыдущей статье мы видели, что передача данных через сокет осуществляется одними и теми же функциями независимо от протокола. Но при этом программа должна учитывать, является ли протокол потоковым, дейтаграммным или иным. Кроме того, информация о протоколе требуется для создания сокета и для распределения ролей между клиентом и сервером при установлении соединения. Чтобы работать с любым протоколом, программа должна иметь возможность получить всю эту информацию и выполнить на основе её те или иные действия. Могут также понадобиться такие сведения, как максимальное число сокетов, поддерживаемых провайдером протокола, допустимый диапазон адресов, максимальный размер сообщений для дейтаграммных протоколов и т.д. Для хранения полного описания протокола и его провайдера в WinSock 2 предусмотрена структура WSAPROTOCOL_INFO. Она не описана в модуле WinSock, т.к. в WinSock 1 её нет. Тем, кто захочет использовать эту структуру, придётся самостоятельно добавлять её описание в программу. Как и все структуры Windows API, она реализуется без выравнивания, т.е. для её описания в Delphi требуется конструкция packed record.
В данной статье мы не будем приводить список полей структуры WSAPROTOCOL_INFO - при необходимости эту информацию легко найти в MSDN'е. Здесь мы рассмотрим только функцию WSAEnumProtocols, которая позволяет получить список всех протоколов, провайдеры которых установлены на компьютере. Прототип функции выглядит следующим образом:
int WSAEnumProtocols(
LPINT lpiProtocols,
LPWSAPROTOCOL_INFO lpProtocolBuffer,
LPDWORD lpdwBufferLength);

function WSAEnumProtocols(
lpiProtocols:PInteger;
lpProtocolBuffer:PWSAProtocolInfo;
var BufferLength:DWord):Integer;

В той версии MSDN'а, которой пользуюсь я, в описании этой функции есть небольшая опечатка: тип параметра lpdwBufferLength назван ILPDWORD вместо LPDWORD.
При переводе прототипа функции на Delphi предполагается, что выше объявлена структура TWSAProtocolInfo - аналог WSAPROTOCOL_INFO, а также указатель на эту структуру PWSAProtocolInfo.
Параметр lpiProtocols указывает на первый элемент массива, содержащего список протоколов, информацию о которых нужно получить. Если этот указатель равен nil, возвращается информация обо всех доступных протоколах. Параметр lpProtocolBuffer содержит указатель на начало массива структур типа TWSAProtocolInfo. Программа должна заранее выделить память под этот массив. Параметр BufferLength при вызове должен содержать размер буфера lpProtocolBuffer в байтах (именно размер в байтах, а не количество элементов). После завершения функции сюда помещается минимальный размер буфера, необходимый для размещения информации о всех запрошенных протоколах. Если это значение больше переданного, функция завершается с ошибкой.
Если параметр lpiProtocols не равен нулю, он должен содержать указатель на массив, завершающийся нулём. То есть, если количество протоколов, запрашиваемых программой, равно N, этот массив должен содержать N+1 элемент, и первые N элементов должны содержать номера протоколов, а последний элемент - ноль.
В системе может быть установлено несколько провайдеров для одного протокола. В этом случае информация о каждом провайдере будет помещена в отдельный элемент массива. Из-за этого количество использованных элементов в массиве lpProtocolBuffer может превышать количество протоколов, определяемых параметром lpiProtocols.
К сожалению, полную информацию о том, каким протоколам какие номера соответствуют, в документации найти не удалось. Можно только сказать, что для получения информации о протоколе TCP в массив lpiProtocols необходимо поместить константу IPProto_TCP, о протоколе UDP - константу IPProto_UDP.
Возвращаемое функцией значение равно числу протоколов, информация о которых помещена в массив, если функция выполнена успешно, и Socket_Error, если при её выполнении возникла ошибка. Конкретная ошибка определяется стандартным методом, с помощью WSAGetLastError. Если массив lpProtocolBuffer слишком мал для хранения всей требуемой информации, функция завершается с ошибкой WSAENoBufs.
WinSock 1 содержит аналогичную по возможности функцию EnumProtocols, возвращающую массив структур PROTOCOL_INFO. Эта структура содержит меньше информации о протоколе, чем WSAPROTOCOL_INFO и, в отличие от последней, не используется никакими другими функциями WinSock. Несмотря на то, что функция EnumProtocols и структура PROTOCOL_INFO описаны в первой версии WinSock, модуль WinSock их не импортирует, при необходимости их нужно импортировать самостоятельно. Но функция EnumProtocols считается устаревшей, использовать её в новых приложениях не рекомендуется, поэтому практически всегда, за исключением редких случаев, требующих совместимости с WinSock 1, лучше использовать новую функцию WSAEnumProtocols.


Теги: asus socket, IP, borland delphi, User Datagram Protocol, Unix, SQL-сервер Borland Delphi

Статьи по теме:

DeleteIndex
Класс TPrinterSettings
Метод ResetPageFooterSize
Базы данных, СУБД, дифференциальные файлы
Заголовок отчета и описание
TableLevel
Общие сведения о сокетах
Storage
Компонент TQRShape
Интеллектуальный анализ данных (ИАД)
Язык программирования
Свойство DataSet
FilePath
ДОБАВЛЕНИЕ ВОЗМОЖНОСТЕЙ РЕДАКТИРОВАНИЯ
Семиуровневая модель ЛВС
| Borland Delphi | Alex |
 


Пн Вт Ср Чт Пт Сб Вс
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31


     



Rambler's Top100

Данный сайт или домен продается ICQ: 403-353-727

© 2009 Seoliga.ru | Borland Delphi | Информация о протоколе. Регион сайта: Москва и Санкт-Петербург