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

на главную

Жанры

О чём не пишут в книгах по 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.

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

Пропала, или Как влюбить в себя жену

Юнина Наталья
2. Исцели меня
Любовные романы:
современные любовные романы
6.70
рейтинг книги
Пропала, или Как влюбить в себя жену

Адепт: Обучение. Каникулы [СИ]

Бубела Олег Николаевич
6. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.15
рейтинг книги
Адепт: Обучение. Каникулы [СИ]

Калибр Личности 1

Голд Джон
1. Калибр Личности
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Калибр Личности 1

У врага за пазухой

Коваленко Марья Сергеевна
5. Оголенные чувства
Любовные романы:
остросюжетные любовные романы
эро литература
5.00
рейтинг книги
У врага за пазухой

Бракованная невеста. Академия драконов

Милославская Анастасия
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Бракованная невеста. Академия драконов

Возвышение Меркурия. Книга 2

Кронос Александр
2. Меркурий
Фантастика:
фэнтези
5.00
рейтинг книги
Возвышение Меркурия. Книга 2

Наследник павшего дома. Том II

Вайс Александр
2. Расколотый мир [Вайс]
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том II

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Теневой путь. Шаг в тень

Мазуров Дмитрий
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Теневой путь. Шаг в тень

Архил...? Книга 2

Кожевников Павел
2. Архил...?
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Архил...? Книга 2

Искатель. Второй пояс

Игнатов Михаил Павлович
7. Путь
Фантастика:
фэнтези
боевая фантастика
6.11
рейтинг книги
Искатель. Второй пояс

Решала

Иванов Дмитрий
10. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Решала

70 Рублей - 2. Здравствуй S-T-I-K-S

Кожевников Павел
Вселенная S-T-I-K-S
Фантастика:
боевая фантастика
постапокалипсис
5.00
рейтинг книги
70 Рублей - 2. Здравствуй S-T-I-K-S

Не верь мне

Рам Янка
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Не верь мне