Чтение онлайн

на главную - закладки

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

Параметр

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
.

2.2.4. Новые функции

В этом разделе мы рассмотрим некоторые новые функции, появившиеся в WinSock 2. Большинство из них позволяет выполнять действия, уже знакомые нам из предыдущих разделов, но предоставляет большие возможности, чем стандартные сокетные функции.

Для создания сокета предназначена функция

WSASocket
со следующим прототипом (листинг 2.38).

Листинг 2.38. Функция
WSASocket

// ***** Описание на C++ *****

SOCKET WSASocket(int af, int SockType, int protocol, LPWSAPROTOCOL_INFO lpProtocolInfo, GROUP g, DWORD dwFlags);

// ***** Описание на Delphi *****

function WSASocket(AF, SockType, Protocol: Integer; lpProtocolInfo: PWSAProtocolInfo; g: TGroup; dwFlags: DWORD): TSocket;

Первые три параметра совпадают с тремя параметрами функции

socket
. Параметр
lpProtocolInfo
указывает на структуру
TWSAProtocolInfo
, содержащую информацию о протоколе, для которого создается сокет. Если этот указатель равен
nil
, функция создает сокет на основании первых трёх параметров так же, как это делает функция
socket
. С другой стороны, если этот параметр не равен
nil
,
то структура, на которую он указывает, содержит всю информацию, необходимую для создания сокета, поэтому первые три параметра должны быть равны константе
FROM_PROTOCOL_INFO
(-1). Параметр
g
зарезервирован для использования в будущем и должен быть равен нулю (тип
TGroup 
совпадает с
DWORD
). Последний параметр
dwFlags
определяет, какие дополнительные возможности имеет создаваемый сокет. Вызов функции
socket
эквивалентен вызову функции
WSASocket
с флагом
WSA_FLAG_OVERLAPPED
, который показывает, что данный сокет можно использовать для перекрытого ввода-вывода (см. разд. 2.2.9). Остальные флаги нужны при многоадресной рассылке (не все из них допустимы для протоколов TCP и UDP). Эти флаги мы рассмотрим в разд. 2.2.11.

В случае TCP и UDP функция

WSASocket
дает следующие преимущества по сравнению с функцией
socket
. Во-первых, через параметр
lpProtocolInfo
появляется возможность явно указать провайдера, который будет выбран программой. Во-вторых, если программа не использует перекрытый ввод-вывод, можно создавать сокеты без флага
WSA_FLAG_OVERLAPPED
, экономя при этом некоторое незначительное количество ресурсов. Кроме того, как это будет обсуждаться далее, с помощью
WSASocket
две разных программы могут работать с одним и тем же сокетом.

Функция

WSAConnect
— это более мощный аналог
connect
. Ее прототип приведен в листинге 2.39.

Листинг 2.39. Функция
WSAConnect
и связанные с ней типы

// ***** Описание на C++ *****

int WSAConnect(SOCKET s, const struct sockaddr FAR* name, int name len, LPWSABUF lpCallerData, LPWSABUF lpCalleeData, LPQOS lpSQOS, LPQOS lpGQOS);

typedef struct __WSABUF {

 u_long len;

 char FAR *buf;

} WSABUF, FAR* LPWSABUF;

// ***** Описание на Delphi ******

function WSAConnect(S: TSocket; var Name: TSockAddr; NameLen: Integer; lpCollerData, lpCalleeData: PWSABuf; lpSQOS, lpGQOS: PQOS): Integer;

PWSABuf = ^TWSABuf;

TWSABuf = packed record

 Len: Cardinal;

 Buf: PChar;

end;

Функция

WSAConnect
устанавливает соединение со стороны клиента. Ее первые три параметра совпадают с параметрами функции connect. Параметр
lpCallerData
и
lpCalleeData
служат для передачи данных от клиента серверу и от сервера клиенту при установлении соединения. Они оба являются указателями на структуру
TWSABuf
тип
TWSABuf
, которая содержит размер буфера 
Len
и указатель на буфер
Buf
. Протоколы стека TCP/IP не поддерживают передачу данных при соединении, поэтому для TCP и UDP
lpCallerData 
и
lpCalleeData
должны быть равны
nil
. Параметры
lpSQOS
и
lpGQOS
— это указатели на структуры, с помощью которых программа передает свои требования к качеству обслуживания, причем параметр
lpGQOS
связан с не поддерживаемым в настоящий момент групповым качеством и всегда должен быть равен
nil
. Параметр
lpSQOS
также должен быть равен
nil
, если программа не предъявляет требований к качеству обслуживания. Так как рассмотрение качества обслуживания выходит за рамки данной книги, мы не приводим здесь определение структуры
SQOS
, которое при необходимости легко найти в MSDN.

Поделиться:
Популярные книги

Кодекс Крови. Книга IV

Борзых М.
4. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IV

Девятый

Каменистый Артем
1. Девятый
Фантастика:
боевая фантастика
попаданцы
9.15
рейтинг книги
Девятый

Кодекс Охотника. Книга XII

Винокуров Юрий
12. Кодекс Охотника
Фантастика:
боевая фантастика
городское фэнтези
аниме
7.50
рейтинг книги
Кодекс Охотника. Книга XII

Его маленькая большая женщина

Резник Юлия
Любовные романы:
современные любовные романы
эро литература
8.78
рейтинг книги
Его маленькая большая женщина

Саженец

Ланцов Михаил Алексеевич
3. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Саженец

Свет во мраке

Михайлов Дем Алексеевич
8. Изгой
Фантастика:
фэнтези
7.30
рейтинг книги
Свет во мраке

(Не)свободные, или Фиктивная жена драконьего военачальника

Найт Алекс
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
(Не)свободные, или Фиктивная жена драконьего военачальника

Вамп

Парсиев Дмитрий
3. История одного эволюционера
Фантастика:
рпг
городское фэнтези
постапокалипсис
5.00
рейтинг книги
Вамп

Инвестиго, из медика в маги 2

Рэд Илья
2. Инвестиго
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Инвестиго, из медика в маги 2

Последняя Арена 4

Греков Сергей
4. Последняя Арена
Фантастика:
рпг
постапокалипсис
5.00
рейтинг книги
Последняя Арена 4

Хозяин Теней 2

Петров Максим Николаевич
2. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Хозяин Теней 2

Идеальный мир для Лекаря 8

Сапфир Олег
8. Лекарь
Фантастика:
юмористическое фэнтези
аниме
7.00
рейтинг книги
Идеальный мир для Лекаря 8

Неудержимый. Книга XI

Боярский Андрей
11. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XI

Двойник Короля 2

Скабер Артемий
2. Двойник Короля
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Двойник Короля 2