Программирование в сетях Windows
.pdf1 08 |
ЧАСТЬ II Интерфейс прикладного программирования Winsock |
Широковещаниеданных
Широковещание данных подразумевает их передачу с одной рабочей станции всем остальным рабочим станциям ЛВС. Этой функцией обладают неориентированные на соединение протоколы, так как все компьютеры в ЛВС могут получать и обрабатывать широковещательные сообщения.
Недостаток широковещательных сообщений — их вынужден обрабатывать каждый компьютер. Например, пользователь передает сообщение всем станциям ЛВС, и сетевой адаптер каждого компьютера получает сообщение и помещает его в сетевой стек. Затем стек определяет, какие сетевые приложения должны получить это сообщение. Обычно большинству компьютеров в сети не нужны эти данные, и они их отбрасывают. Тем не менее, каждый вынужден тратить время на обработку пакета данных, чтобы проверить, нужны ли они для какого-нибудь приложения. Следствием является высокая рабочая нагрузка при широковещании, что может существенно замедлить работу в ЛВС. В общем, маршрутизаторы не транслируют широковещательных пакетов данных.
Многоадресное вещание
Под многоадресным, вещанием понимается способность одного процесса передавать данные одному или более получателям. Методика присоединения процесса к многоадресному сеансу зависит от применяемого для передачи данных протокола.
Например, многоадресная передача по протоколу IP является видоизмененной формой широковещания. Для нее необходимо, чтобы все заинтересованные в приеме и передаче узлы были членами особой группы. При присоединении процесса к группе многоадресного вещания на сетевом адаптере добавляется фильтр. Он заставляет сетевое оборудование обрабатывать и транслировать по сетевому стеку до соответствующего процесса только данные, предназначенные групповому адресу, к которому присоединился процесс. Многоадресная передача часто применяется в приложениях для видеоконференций. Подробнее о программировании многоадресного вещания средствами Winsock — в главе 11.
Качество обслуживания
Управляя качеством обслуживания (Quality of Service, QoS), приложение может зарезервировать определенную часть пропускной способности сети для монопольного использования. Рассмотрим для примера воспроизведение видеопотока в реальном времени. Для его плавности и четкости видеоданные должны поступать из сети равномерно и с определенной скоростью. В недавнем прошлом плавное воспроизведение достигалось за счет накапливания видеоданных в буфере. Если данные передавались неравномерно, паузы сглаживались кадрами из буфера. QoS позволяет резервировать определенную часть емкости канала связи, чтобы гарантировать равномерную передачу и считывание видеоданных. Теоретически это означает, что за счет использования QoS приложение может не буферизовать информацию. QoS посвящена глава 12.
Г Л А В А 5 Сетевые протоколы |
1(09 |
фрагментарные сообщения
фрагментарные сообщения (partial message) передают только ориентированные на сообщения протоколы. Предположим, приложению необходимо получить сообщение, а локальный компьютер принял лишь часть данных. Это обычное явление, особенно если компьютер-отправитель передает крупные сообщения. У локального компьютера может не хватить ресурсов, чтобы вместить сообщение целиком. На самом деле, большинство ориентированных на сообщение протоколов налагают разумные ограничения на максимально возможный размер дейтаграммы, чтобы такая ситуация не возникала часто.
Большинство дейтаграммных протоколов поддерживает передачу крупных сообщений, которые требуется переправлять по физической среде несколькими блоками. В результате, когда пользовательское приложение попытается прочесть сообщение, фактически будет принят лишь его фрагмент. Если протокол поддерживает фрагментарные сообщения, читатель уведомляется, что возвращаемые данные — лишь часть сообщения. Иначе базовый сетевой стек пытается сохранить фрагменты сообщения до тех пор, пока сообщение не поступит целиком. Если по какой-либо причине остатки сообщения не будут приняты, большинство ненадежных протоколов, не поддерживающих фрагментарные сообщения, просто отбросят неполную дейтаграмму.
Маршрутизация
Важно учесть, является ли протокол маршрутизируемым. Если да, то между двумя рабочими станциями можно установить канал связи (виртуальный ориентированный на соединение либо канал передачи дейтаграмм), независимо от того, какая сетевая аппаратура их разделяет. Например, компьютер А находится в отдельной от компьютера В подсети. Между ними расположен маршрутизатор, соединяющий эти подсети. Маршрутизируемый протокол «знает», что эти компьютеры расположены в разных подсетях, поэтому направляет пакет данных маршрутизатору, который решает, как лучше переслать данные компьютеру В. Поскольку немаршрутизируемый протокол не способен передавать данные между сетями, маршрутизатор удаляет любые его пакеты. Маршрутизатор не пересылает пакет данных немаршрутизируемого протокола, даже если его адресат находится в подключенной подсети. Единственный немаршрутизируемый протокол, поддерживаемый платформами Win32 — NetBEUI.
Другие характеристики
Каждый протокол, поддерживаемый на платформах Win32, обладает специфичными или уникальными характеристиками: например, порядком передачи байт или максимально допустимым размером пакета. Однако далеко не
еэти характеристики важны для разработки Winsock-приложения. В Win- £. предусмотрен механизм перечисления каждого доступного поставщи-
ротокола и опроса его характеристик (он описан разделе «Информация ° протоколе» этой главы).
110 ЧАСТЬ II Интерфейс прикладного программирования Winsock
Поддерживаемые протоколы
Весьма полезно, что платформы Win32 одновременно поддерживают несколько сетевых протоколов. Как уже упоминалось в главе 2, перенаправитель Windows гарантирует маршрутизацию сетевых запросов соответствующим протоколам и подсистемам. Впрочем, средствами Winsock вы можете написать сетевые приложения, напрямую использующие любой из этих протоколов. В главе б рассказывается, как происходит адресация компьютеров в сети при помощи протоколов, установленных на рабочей станции. Важно, что Winsock не зависит от протокола: большинство операций схожи при использовании любого протокола. Впрочем, способы адресации рабочих станций необходимо знать, чтобы определить местоположение и соединиться с сетевым партнером.
Сетевыепротоколы,поддерживаемыеWin32
Платформы Win32 поддерживают разнообразные протоколы. Каждый протокол обычно способен работать в нескольких режимах. Например, протокол IP поддерживает как ориентированные на соединение поточные службы, так и службы дейтаграмм, не ориентированные на соединение. В табл. 5-1 перечислены основные доступные протоколы и некоторые поддерживаемые ими режимы работы.
Табл. 5-1. Характеристики доступных протоколов
Про- |
Имя |
Тип |
Уста- |
НадежПорядок |
Коррект- |
Под- |
Под- |
QoS |
Макс. |
|
токол |
|
сообновка ность пакетов |
ное завер- |
держка |
держка |
|
размер |
|||
|
|
щения |
соеди- |
|
|
шение |
широко- |
многоад- |
|
сообщения |
|
|
|
нения |
|
|
сеанса |
вещания ресное™ |
|
(байт) |
|
|
|
|
|
|
|
|
|
|||
IP |
MSAFD Поток Да |
Да |
Да |
Да |
Нет |
Нет |
Нет Без огра- |
|||
|
TCP |
|
|
|
|
|
|
|
|
ничений |
|
MSAFD |
Сооб- |
Нет |
Нет |
Нет |
Нет |
Да |
Да |
Нет 65467 |
|
|
UDP |
щение |
|
|
|
|
|
|
|
|
|
RSVP |
Поток |
Да |
Да |
Да |
Да |
Нет |
Нет |
Да |
Без огра- |
|
TCP |
|
|
|
|
|
|
|
|
ничений |
|
RSVP |
СообНет |
Нет |
Нет |
Нет |
Да |
Да |
Да |
65467 |
|
|
UDP |
щение |
|
|
|
|
|
|
|
|
IPX/ |
MSAFD СообНет |
Нет |
Нет |
Нет |
Да |
Да |
Нет |
576 |
||
SPX |
nwln- |
щение |
|
|
|
|
|
|
|
|
|
kipx |
|
|
|
|
|
|
|
|
|
|
[IPX] |
|
|
|
|
|
|
|
|
|
|
MSAFD |
Сооб- |
Да |
Да |
Да |
Нет |
Нет |
Нет |
Нет |
Без огра- |
|
nwln- |
щение |
|
|
|
|
|
|
|
ничений |
|
kspx |
|
|
|
|
|
|
|
|
|
|
[SPX] |
|
|
|
|
|
|
|
|
|
|
MSAFD |
Сооб- |
Да |
Да |
Да |
Нет |
Нет |
Нет |
Нет |
Без огра- |
|
nwln- |
щение |
|
|
|
|
|
|
|
ничений |
kspx [SPX] [псевдопоток]
|
|
|
|
|
|
Г Л А ВА |
5 |
Сетевые протоколы |
1J1 |
||
|
|
|
|
|
|
|
|
|
|||
Табл. 5-1. |
(продолжение) |
|
|
|
|
|
|
|
|||
Про- |
Имя |
Тип |
Уста- |
НадежПорядок |
Коррект- |
Под- |
Под- |
OoS |
Макс. |
||
токол |
|
сообновка ность пакетов |
ное завер- |
держка |
держка |
|
размер |
||||
|
|
щения |
соеди- |
|
|
шение |
широко- |
многоад- |
|
сообщения |
|
|
|
|
нения |
|
|
сеанса |
вещания |
ресности |
|
(байт) |
|
|
MSAFD |
Сооб- |
Да |
Да |
Да |
Да |
Нет |
|
Нет |
Нет |
Без oi ра- |
|
nwln- |
щение |
|
|
|
|
|
|
|
|
ничений |
|
kspx |
|
|
|
|
|
|
|
|
|
|
|
[SPXII] |
|
|
|
|
|
|
|
|
|
|
|
MSAFD СообДа |
Да |
Да |
Да |
Нет |
|
Нет |
Нет |
Без огра- |
||
|
nwln- |
щение |
|
|
|
|
|
|
|
ничений |
|
|
kspx |
|
|
|
|
|
|
|
|
|
|
|
[SPXII] |
|
|
|
|
|
|
|
|
|
|
|
[псевдо- |
|
|
|
|
|
|
|
|
|
|
|
поток] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Net- |
SequenСооб- |
Да |
Да |
Да |
Нет |
Нет |
|
Нет |
Нет |
64 кб |
|
BIOS |
ml Расщение |
|
|
|
|
|
|
|
|
(65535) |
|
|
kets |
|
|
|
|
|
|
|
|
|
|
|
(после- |
|
|
|
|
|
|
|
|
|
|
|
дователь- |
|
|
|
|
|
|
|
|
|
|
|
ность |
|
|
|
|
|
|
|
|
|
|
|
пакетов) |
|
|
|
|
|
|
|
|
|
|
|
DatagСообНет |
Нет |
Нет |
Нет |
Да1 |
|
Нет |
Нет |
64 кб |
||
|
rams |
щение |
|
|
|
[SP25] |
|
|
(65535) |
||
|
(дейтаг- |
|
|
|
|
|
|
|
|
|
|
|
раммы) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
AppleMSAFD |
Сооб- |
Да |
Да |
Да |
Да |
Нет |
|
Нет |
Нет |
64 кб |
|
Talk |
Apple- |
щение |
|
|
|
|
|
|
|
|
(65535) |
|
Talk |
|
|
|
|
|
|
|
|
|
|
|
[ADSP] |
|
|
|
|
|
|
|
|
|
|
|
MSAFD |
Сооб- |
Да |
Да |
Да |
Да |
Нет |
|
Нет |
Нет |
Без огра- |
|
Apple- |
щение |
|
|
|
|
|
|
|
|
ничений |
|
Talk |
|
|
|
|
|
|
|
|
|
|
|
[ADSP] |
|
|
|
|
|
|
|
|
|
|
|
[псевдо- |
|
|
|
|
|
|
|
|
|
|
j |
поток] |
|
|
|
|
|
|
|
Нет |
Нет |
4096 |
|
MSAFD |
Сооб- |
Да |
Да |
Да |
Да |
Нет |
|
|||
|
Apple- |
щение |
|
|
|
|
|
|
|
|
|
|
Talk [PAP] |
|
|
|
|
|
|
|
|
|
|
|
MSAFD |
Поток |
Нет |
Нет |
Нет |
Нет |
Нет |
|
Нет |
Нет |
Без огра- |
|
Apple- |
|
|
|
|
|
|
|
|
|
ничений |
on |
Talk |
|
|
|
|
|
|
|
|
|
|
|
[RTMP] |
|
|
|
|
|
|
|
|
|
|
|
MSAFD Поток Нет |
Нет |
Нет |
Нет |
Нет |
|
Нет |
Нет |
Без огра- |
||
|
Apple- |
|
|
|
|
|
|
|
|
|
ничений |
|
Talk |
|
|
|
|
|
|
|
|
|
|
|
[ZIP] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ATM |
MSAFD |
Поток |
Да |
Нет |
Да |
Нет |
Нет |
|
Да |
Да |
Без огра- |
|
ATM |
|
|
|
|
|
|
|
|
|
ничений |
|
AAL5 |
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
NetBIOS поддерживает отправку дейтаграмм как уникальным, так и групповым |
|||||||||||
клиентам, общее широковещание не поддерживается |
»<3„ |
|
|
|
см. след. стр.
112 ЧАСТЬ II Интерфейс прикладного программирования Winsock
Табл., 5 - 1 . {продолжение)
ПроИмя токол
Тип |
Уста- |
НадежПорядок |
Коррект- |
Под- |
Под- |
QoS Макс, |
сооб- |
новка |
ность пакетов |
ное завер- |
держка |
держка |
размер |
щения |
соеди- |
|
шение |
широко- |
многоад- |
сообщения |
|
нения |
|
сеанса |
вещания |
ресное™ |
(байт) |
|
Native |
Сооб- Да |
Нет |
Да |
Нет |
Нет |
Да |
Да |
Без огра- |
|
ATM |
щение |
|
|
|
|
|
|
ничений |
|
(AAL5) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Infra- |
MSAFD |
По гок Да |
Да |
Да |
Да |
Нет |
Нет |
Нет |
Без огра- |
red SoIrda |
|
|
|
|
|
|
|
ничений |
|
ckets |
[IrDA] |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
СетевыепротоколывWindowsСЕ
В отличие от других платформ Win32, Windows СЕ поддерживает только TCP/IP. Кроме того, Windows СЕ поддерживает только Winsock 1.1, поэтому большинство новых возможностей Winsock 2, описанных в этом разделе, не применимы к данной платформе. Windows СЕ поддерживает NetBIOS поверх TCP/IP при помощи перенаправителя, но не позволяет обращаться к этому протоколу ни через «родной» API-интерфейс NetBIOS, ни через Winsock.
Информация о протоколе
Winsock 2 позволяет узнать, какие протоколы и с какими характеристиками установлены на рабочей станции. Для каждого рабочего режима протокола существует соответствующая запись каталога в рамках системы. Например, после установки TCP/IP в каталог будут занесены две записи для IP: одна для протокола TCP (надежного, с установлением соединения), вторая — для протокола UDP (ненадежного, без установления соединения).
Узнать об установленных сетевых протоколах можно с помощью функции WSAEnumProtocols:
int WSAEnumProtocols ( LPINT lpiProtocols,
LPWSAPROTOCOL_INFO lpProtocolBuffer, LPDWORD lpdwBufferLength
Она заменила функцию EnumProtocols из Winsock 1.1, применяемую в Windows СЕ. Единственное отличие: WSAEnumProtocols возвращает массив структур WSAPROTOCOLJNFO, a EnumProtocols — массив структур PROTOCOL INFO, содержащий меньше полей, чем структура WSAPROTOCOLJNFO (хотя информация та же). Структура WSAPROTOCOLJNFO определена так:
typedef struct _WSAPROTOCOL_INFOW { |
|
|
DWORD |
dwServiceFlagsi; |
|
DWORD |
dwServiceFlags2; |
|
DWORD |
dwServiceFlags3; |
|
DWORD |
dwServiceFlags4; |
< ш, |
|
Г Л А ВА |
5 Сетевые протоколы |
113 |
|
|
|
|
DWORD |
dwProviderFlags; |
|
|
GUID |
Providerld; |
|
|
DWORD |
dwCatalogEntryld; |
|
|
WSAPROTOCOLCHAIN |
ProtocolChain; |
|
|
int |
iVersion; |
|
|
int |
iAddressFamily; |
|
|
int |
iMaxSockAddr; |
|
|
int |
iMinSockAddr; |
|
|
int |
iSocketType; |
|
|
int |
iProtocol; |
|
|
int |
iProtocolMaxOffset; |
|
|
int |
INetworkByteOrder; |
|
|
int |
ISecurityScheme; |
|
|
DWORD |
dwMessageSize; |
|
|
DWORD |
dwProviderReserved; |
|
|
WCHAR |
szProtocol[WSAPROTOCOL_LEN + |
1]; |
|
} WSAPROTOCOL_INFOW, FAR * LPWSAPR0TOCOL_INFOW;
ИнициализацияWinsock
Перед вызовом любой функции Winsock необходимо загрузить правильную версию библиотеки Winsock. Функция инициализации Winsock —
WSAStartup:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
Первый параметр — версия библиотеки Winsock, которую необходимо загрузить. На современных платформах Win32 используется версия 2.2. Единственное исключение — Windows СЕ, поддерживающая только Winsock 1.1. Для загрузки версии Winsock 2.2 укажите значение 0x0202, либо макрос MAKEWORD(2, 2). Верхний байт определяет дополнительный номер версии, нижний — основной.
Второй параметр — структура WSADATA, возвращаемая по завершении вызова. Она содержит информацию о версии Winsock, загруженной функцией WSAStartup:
typedef struct WSAData { |
|
||
WORD |
|
wVersion; |
|
WORD |
|
wHighVersion; |
|
char |
|
szDescription[WSADESCRIPTION_LEN |
+ 1] |
char |
|
szSystemStatus[WSASYS_STATUS_LEN |
+ 1] |
unsigned |
short |
iMaxSockets; |
|
unsigned |
short |
iMaxUdpDg; |
|
char FAR |
* |
lpVendorlnfo; |
|
> WSADATA, FAR * LPWSADATA;
Единственная полезная информация, возвращаемая в структуре WSADATA—поляwVersionиwHighVersion.Поля,относящиесякмакси- мальному количеству сокетов и максимальному размеру UDP, следует получать из записи каталога для конкретного протокола. Ранее мы
см.след.стр.
114 |
ЧАСТЬ II Интерфейс прикладного программирования Winsock |
говорили об этом, когда приводили описание WSAEnumProtocols и возвращаемых этой функцией структур.
Индивидуальные поля структуры WSADATA таковы:
ШwVersion — версия Winsock, которую предполагает использовать
ВЫЗОВ;
• wHighVersion — высшая версия Winsock, поддерживаемая загруженной библиотекой (как правило, то же значение, что и wVersion)
Ш szDescription — текстовое описание загруженной библиотеки; Ш szSystemStattis — текстовая строка с соответствующей информа-
цией о состоянии или конфигурации;
• iMaxSockets — максимальное количество сокетов (пропустите это поле для Winsock 2 и более поздних версий);
Ж iMaxUdpDg — максимальный размер дейтаграммы UDP;
• ipVendorlnfo — информация об изготовителе (пропустите это поле для Winsock 2 и более поздних версий).
По завершении работы с библиотекой Winsock вызовите функцию WSACleanup для выгрузки библиотеки и освобождения ресурсов:
int WSACleanup (void);
Для каждого вызова WSAStartup необходимо согласованно вызывать WSACleanup, так как каждый стартовый вызов увеличивает значение эталонного счетчика ссылок на загруженные Winsock DLL. Чтобы уменьшить значение счетчика, требуется равное количество вызовов WSACleanup.
Обратите внимание: Winsock 2 полностью совместим со всеми вызовами функций Winsock 1.1. Поэтому приложение, написанное для Winsock 1.1, будет работать и с библиотекой Winsock 2- функции Winsock 1.1 сопоставляются их эквивалентам в Winsock 2.
Проще всего задать WSAEnumProtocols с ipProtocolBujfer, равным NULL, и IpdwBufferLength — равным 0. При вызове с WSAENOBUFS произойдет ошибка, однако IpdwBufferLength будет содержать размер буфера, достаточный для возвращения всей информации о протоколах. Вызвав функцию с правильным размером буфера, вы получите несколько структур WSAPROTOCOLJNFO. Просмотрите структуры в цикле и найдите запись протокола с необходимыми атрибутами Программа Enum.c на прилагаемом компакт-диске перечисляет все установленные протоколы и распечатывает их характеристики.
Особенно часто в структуре WSAPROTOCOLJNFO используется поле dwServiceFlagsl — битовая маска разных атрибутов протокола. В следующем списке перечислены битовые флаги и действия, которые инициируются, если данный флаг задан.
• ХР1 CONNECTIONLESS — протокол передает данные без установлени соединения; если флаг не задан — с установлением соединения.
*ХР1 GUARANTEED DELIVERY— протокол гарантирует доставку данных получателю.
Г Л А ВА 5 Сетевые протоколы |
115 |
ж XPl GUARANTEED_ORDER — протокол гарантирует доставку данных в порядке их отправки без дублирования, хотя саму доставку не гарантирует.
щXPl MESSAGEORIENTED — протокол обрабатывает границы сообще-
ний.
ш xpjPSEUDOSTREAM — протокол передает сообщения, но границы сообщений игнорируются приемником.
Ш XPl GRACEFULjCLOSE — протокол поддерживает двухфазное завершение сеанса (каждая сторона уведомляется о намерении другой завершить сеанс связи). Если этот флаг не задан, сеанс разрывается без предупреждения.
щXPl EXPEDITED DATA — протокол поддерживает обмен срочными (out- of-band) данными
т XP1_CONNECT_DATA — протокол поддерживает передачу данных с запросом соединения.
• XP1DISCONNECTDATA — протокол поддерживает передачу данных с запросом разъединения.
Ш ХР 1 SUPPORTBROADCAST — протокол поддерживает механизм широковещания.
•XPl SUPPORT MULTIPOINT — протокол поддерживает механизм многоадресной передачи данных.
ШXPl MULTIPOINTCONTROLPLANE — плоскость управления (control plane) маршрутизируется, если флаг не задан — этого не происходит.
•ХР 1_MULTIPOINT_DATA_PLANE — плоскость данных маршрутизируется, если флаг не задан — этого не происходит.
ШXPlQoS SUPPORTED — протокол поддерживает запросы QoS.
*ХР 1_UNI_SEND — протокол однонаправленный и обеспечивает лишь отправку данных.
*XP1UNIRECV — протокол однонаправленный и обеспечивает лишь прием данных.
*XP1_IFS_HANDLES — дескрипторы сокета, возвращенные поставщиком, являются описателями файловой системы IFS и могут быть использованы в таких API-функциях, как ReadFile и WriteFile.
Ш XPl PARTIAL MESSAGE — флаг MSG_PARTIAL поддерживается функциями WSASend и WSASendTo.
Для проверки наличия определенного свойства выберите соответствующий флаг и логически сложите его с полем dwServiceFlags 1. Если результат сложения ненулевой, протокол обладает указанным свойством, иначе — нет.
ьольшинство из приведенных в списке флагов подробно описаны в следующих главах. Поэтому сейчас рассмотрим другие, не менее важные поля: iProtocol, iSocketType и iAddressFamily.
116 |
ЧАСТЬ II Интерфейс прикладного программирования Winsock |
Поле iProtocol определяет, к какому протоколу относится данная запись Поле iSocketType важно, если протокол способен работать в разных режимах, например, с установлением поточного или дейтаграммного соединения И наконец, поле lAddressFamily позволяет выяснить корректную структуру адресации, применяемую данным протоколом Эти три поля очень важны при создании сокета для конкретного протокола
СокетыWindows
Рассмотрим, как доступные протоколы используют средства Winsock Как вы уже, вероятно, знаете, этот интерфейс основан на понятии сокета Сокет — это описатель поставщика транспорта В Win32 сокет отличается от описателя файла, а потому представлен отдельным типом — SOCKET Сокет создается одной из двух функций
SOCKET WSASocket ( int af,
int type, int protocol,
LPWSAPROTOCOL_INFO lpProtOCOlInfo, GROUP g,
DWORD dwFlags
SOCKET socket ( int af,
int type, int protocol
Первый параметр — af, определяет семейство адресов протокола Например, если вы хотите создать UDPили ТСР-сокет, подставьте константу AF_ INET, чтобы сослаться на протокол IP Второй параметр — type, это тип сокета для данного протокола Он может принимать одно из следующих значений
SOCKSTREAM,SOCK_DGRAM,SOCKJEQPACKET,SOCK_RAWnSOCKRDMТретий параметр — protocol, указывает конкретный транспорт, если для данного семейства адресов и типа сокета существует несколько записей В табл 5-2 перечислены значения, используемые в полях семейства адресов, типа сокета и протокола для данного сетевого транспорта
Табл. 5-2. Параметры сокетов
Протокол |
|
Семейство |
Тип сокета |
Протокол |
|
|
|
|
адресов |
|
|
|
|
Internet |
|
AFINET |
TCP |
SOCKSTREAM |
IPPROTOJP |
|
Protocol (IP) |
|
|
UDP |
SOCKDGRAM |
1PPROTOJJDP |
|
|
|
|
Простые сокеты |
SOCKRAW |
IPPROTO_RAW |
|
|
|
|
|
|
|
1PPROTOJCMP |
IPX/SPX |
AF NS |
MSAFD nwln- |
SOCKDGRAM |
NSPROTOIPX |
||
|
|
|
kipx [IPX] |
|
|
|
|
|
ГЛАВА 5 Сетевые протоколы |
,117 |
||
|
|
|
|
|
|
|
Табл. 5-2. |
(продолжение) |
|
|
|
|
|
|
|
|
|
|
|
|
Протокол |
Семейство |
Тип сокета |
Протокол |
|
|
|
|
адресов |
|
|
|
|
|
|
AFJPX |
MSAFD nwln- |
SOCK SEQ- |
NSPROTOJPX |
|
|
|
|
kspx [SPX] |
PACKET |
|
|
|
|
|
MSAFD nwln- |
SOCKJTREAM |
NSPROTO SPX |
|
|
|
|
kspx [SPX] |
|
|
|
|
|
|
[псевдопоток] |
|
|
|
|
|
|
MSAFD nwln- |
SOCK SEQ- |
NSPROTOJPXII |
||
|
|
kspx [SPXII] |
PACKET |
|
|
|
|
|
MSAFD nwlnk- |
SOCKJTREAM |
NSPROTOJPXII |
||
|
|
spx [SPXII] |
|
|
|
|
|
|
[псевдопоток] |
|
|
|
|
NetBIOS |
AFJVETBIOS Последова- |
SOCK SEQ- |
Номер LANA |
|
|
|
|
|
тельные пакеты |
PACKET |
|
|
|
|
|
Дейтаграммы |
SOCKDGRAM |
Номер LANA |
|
|
AppleTalk |
AFAPPLE- |
MSAFD Apple- |
SOCKJUDM |
ATPROTOADSP |
||
|
TALK |
Talk [ADSP] |
|
|
|
|
|
|
MSAFD Apple- |
SOCKJTREAM |
ATPROTOADSP |
||
|
|
Talk [ADSP] |
|
|
|
|
|
|
[псевдопоток] |
|
|
|
|
|
|
MSAFD Apple- |
SOCK_RDM |
ATPROTOPAP |
|
|
|
|
Talk [PAP] |
|
|
|
|
|
|
MSAFD Apple- |
SOCKJDGRAM |
DDPPROTO |
|
|
|
|
Talk [RTMP] |
|
RTMP |
|
|
|
|
MSAFD Apple- |
SOCKJDGRAM |
DDPPROTOZIP |
||
|
|
Talk [ZIP] |
|
|
|
|
ATM |
AF_ATM |
MSAFDATM |
SOCKJtAW |
ATMPROTO_AAL5 |
||
|
|
AAL5 |
|
|
|
|
|
|
NativeATM |
SOCK_RAW |
ATMPROTO_AAL5 |
||
|
|
(AAL5) |
|
|
|
|
Infrared |
AFJRDA |
MSAFDIrda |
SOCKJTREAM |
IRDA PROTO |
|
|
Sockets |
|
[IrDA] |
|
SOCK_STREAM |
Начальные три параметра для создания сокета подразделены на три уровня Первый и самый важный — семейство адресов Он указывает используемый в настоящее время протокол и ограничивает применение второго и третьего параметров Например, семейство адресов ATM (AF_ATM) позволяет использовать только простые сокеты (SOCKJZAW) Аналогично, выбор семейства адресов и типа сокета ограничивает выбор протокола
Впрочем, можно передать в параметре protocol значение О В этом случае истема выбирает поставщика транспорта, исходя из других двух параметров — of и type Перечисляя записи каталога для протоколов, проверьте значение поля dwProviderFlags из структуры WSAPROTOCOLJNFO Если оно равно PFL_ MATCHES'_PROTOCOL_ZERO — это стандартный транспорт, применяемый, если в параметре протокола socket или WSASocket передано значение О
еречислив все протоколы с помощью WSAEnumProtocols, передайте струкРУ WSAPROTOCOLJNFO в функцию WSASocket как параметр ipProtocolInfo