Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Программирование в сетях Windows

.pdf
Скачиваний:
538
Добавлен:
11.03.2015
Размер:
3.02 Mб
Скачать

268 ЧАСТЬ II Интерфейс прикладного программирования Winsock

ПараметрTCPJIODELAY

Чтобы увеличить эффективность и пропускную способность за счет уменьшения издержек, система выполняет алгоритм Nagle, который позволяет «укрупнить > пакеты TCP Издержки в том, что длина заголовка TCP для каждого пакета — 20 байт Расточительно отправлять сообщения по 2 байта с 20-бай- товым заголовком, поэт ому когда приложение запрашивает порцию данных, система сможет накапливать данные в течение некоторою времени перед фактической отправкой по сети Если дополнительные данные за указанный период времени не накопятся отправка произойдет безусловно

Недоста i ок этого алгоритма — замедление подтверждений о получении данных TCP Но поскольку узел будет жда гь накопления данных для отправки партнеру, он может присоединить уведомление АСК к следующей порции данных, а не отправить ею сразу в отдельном пакете

Параметр TCP_NODELAY (тип optval BOOL, версия Winsock 1+) можно

иполучить, и задать Если он равен TRUE, алгоритм Nagle отключается Этот алгоритм порой отрицательно воздействует на какое-либо сетевое приложение, которое отправляет данные в от носительно небольшом количестве и ожидает своевременного ответа Классический пример — Telnet, ин герактивное приложение, позволяющее пользователю войти на удаленную машину

идавать ей команды Как правило, пользователь нажимает на клавиши по несколько раз в секунду, и алгори гм Nagle такой сеанс просто бы «тормозил»

УровеньпараметровNSPROTOJPX

Описанные в этом разделе параметры сокета специфичны для Microsoft-рас- ширения интерфейса сокетов Window IPX/SPX и предназначены для совместимости с существующими приложениями Впрочем, их не рекомендуются использовать, поскольку они гарантированно работают только со стеком Microsoft IPX/SPX Приложение, использующее эти расширения, не сможет работать в других реализациях IPX/SPX Эти параметры определены в файле WSNwLink h, который должен быть включен после Winsock h и Wsipx h

ПараметрIPX_PTYPE

Этот параметр (тип optval int, версия Winsock 1+) можно и получить, и задать Значение аргумента optval будет определять тип каждого пакета IPX, отправленного с этого сокета

Параметр1PXJFILTERPTYPE

Этот параметр (тип optval — int, версия Winsock 1+) можно и получить, и задать Он определяет тип пакета для фильтрации получаемых данных При любом вызове приема возвращаются только пакеты IPX с типом, указанным в optval, остальные — отбрасываются

ПараметрIPXJSTOPFILTERPTYPE

Этот параметр (тип optval int, версия Winsock 1+) можно только задать Он позволяет прекратить фильтрацию типов пакетов, заданную параметром

IPX FILTERPTYPE

Г Л А В А 9 Параметры сокета и команды управления вводом-выводом

269

ПараметрIPX_DSTYPE

Этот параметр (тип optval — mt, версия Winsock 1+) можно и получить, и задать Он представляет значение поля потока данных в заголовке SPX каждого отправленного пакета

ПараметрIPX_EXTENDED_ADDRESS

Этот параметр (тип optval BOOL, версия Winsock 1+) можно и получить, и задать Он разрешает (если равен TRUE) или запрещает расширенную адресацию пакетов IPX При отправке он добавляет элемент unsigned char sajitype к структуре SOCKADDRJPX, в результате чего ее полная длина достигает 15 байт При приеме к структуре SOCKADDRJPX сразу добавляются и saJJtype, и unsigned char sajlags, после чего длина ее достигает 1б байт Текущие биты, определенные в sajlags

Ш 0x01 — полученный кадр был отправлен путем широковещания,

0x02 — полученный кадр была отправлен с этого компьютера

ПараметрIPXJRECVHDR

Этот параметр (тип optval — BOOL, версия Winsock 1+) можно и получить, и задать Если он равен TRUE, то вызов любой функции приема Winsock возвращает вместе с данными заголовок IPX

ПараметрIPXJVIAXSIZE

Этот параметр (тип optval — mt, версия Winsock 1+) можно только получить Вызов getsockopt возвращает максимально возможный размер дейтаграммы IPX

ПараметрIPX_ADDRESS

Этот параметр (тип optval — LPX_ADDRESSJDATA, версия Winsock 1+) можно только получить Он запрашивает информацию об определенном адаптере, связанном с IPX В системе с п адаптерами они пронумерованы от 0 до п-\ Чтобы узнать количество IPX-адаптеров в системе, используйте параметр

IPX_MAX_ADAPTERJVUM с функцией getsockopt или вызывайте IPX_ADDRESS

с увеличением значений adaptemum, пока не будет возвращена ошибка Параметр optval указывает на структуру IPX_ADDRESSJDATA

typedef struct _IPX ADDRESS

DATA

 

 

 

 

{

 

 

 

 

 

 

 

INT

adapternum

//

Ввод

Номер

адаптера, начинающийся

с О

UCHAR

netnum[4],

//

Вывод

Номер сети

IPX

 

UCHAR

nodenum[6]

//

Вывод

IPX-адрес

узла

 

BOOLEAN

wan,

//

Вывод

TRUE

= адаптер на ГВС-канале

BOOLEAN

status,

//

Вывод

TRUE

= связь по ГВС отсутствует (или адаптер

 

 

// не связан с ГВС)

 

 

INT

maxpkt;

//

Вывод

максимальный размер пакета,

исключая заголовок

IPX

t/LONG

linkspeed;

// Вывод скорость связи в 100 байт/сек

2 70

ЧАСТЬ II

Интерфейс прикладного программирования Winsock

 

 

// (т.е 96 == 9600 bps)

} IPX_ADDRESS_DATA,

*PIPX_ADORESS_DATA;

ПараметрIPX_GETNETINFO

Этот параметр (тип optval IPX_NETNUM_DATA, версия Winsock 1+) можно только получить Он возвращает информацию относительно определенного номера сети IPX Если сеть — в кэше IPX, параметр возвращает информацию напрямую В ином случае рассылаются RIP-запросы, чтобы ее обнаружить Параметр optval указывает на действительную структуру IPX_NETNUM_DATA.

typedef struct _IPX_NETNUM_DATA

{

 

 

 

 

 

UCHAR

netnum[4];

//

Ввод.

Номер сети

IPX

USHORT hopcount;

//

Вывод.

Количество транзитов для этой сети по

 

 

//

порядку

компьютеров

USHORT

netdelay;

//

Вывод

количество "тиков" для этой сети по

 

 

//

порядку

компьютеров

INT

cardnum;

// Вывод: начинающийся с 0 номер адаптера, используемый

для

 

 

 

 

 

 

 

// направления в эту сеть; может быть использован как

 

 

// значение для adapternum в поле IPX_ADDRESS

UCHAR

router[6];

//

Вывод

МАС-адрес

маршрутизатора следующего транзита,

//равен 0, если сеть уже достигнута

}IPX_NETNUM_DATA, *PIPX_NETNUM_DATA;

ПараметрIPX_GETNETINFO_NORIP

Этот параметр (тип optval 1PX_NETNUM_DATA, версия Winsock 1+) можно и получить, и задать Если возвращается TRUE, то дейтаграммы не фрагментируются IP. Этим он напоминает IPX_GETNETINFO, но IPX_NETNUM_DATA не рассылает RIP-запросы Если сеть находится в кэше IPX, то параметр возвращает информацию, иначе выдается ошибка (см. также параметр IPX_RERIPNETNUMBER, который всегда рассылает RIP-запросы). Как и в случае IPXjGETNETINFO, для использования этого параметра требуется, чтобы параметр optval указывал на структуру IPX_NETNUM_DATA.

ПараметрIPX_SPXGETCONNECTIONSTATUS

Этот параметр (тип optval — IPX_SPXCONNSTATUS_DATA, версия Winsock 1+) можно только получить Он возвращает информацию о связанном SPX-co- кете Параметр optval указывает на структуру IPX_SPXCONNSTATUS_DATA. Все числа даны в сетевом порядке байт (от высокого к низкому)

typedef struct _IPX_SPXCONNSTATUS_DATA

{

UCHAR ConnectionState;

UCHAR WatchDogActive; USHORT LocalConnectionld; USHORT RemoteConnectionld; USHORT LocalSequenceNumber;

 

 

11ау«м«|уы t-uiwid и команды управления вводом-выводом

 

USHORT

LocalAckNumber;

 

USHORT

LocalAllocNumber;

 

USHORT

RemoteAckNumber;

 

USHORT

RemoteAllocNumber;

 

USHORT

LocalSocket;

Л,

UCHAR

ImmediateAddress[6];

 

UCHAR

RemoteNetwork[4];

o,,

UCHAR

RemoteNode[6];

 

USHORT

RemoteSocket;

 

USHORT

RetransmissionCount;

 

USHORT

EstimatedRoundTripDelay; /• In milliseconds •/

 

USHORT

RetransmittedPackets;

 

USHORT

SuppressedPacket;

}

IPX_SPXCONNSTATUS_DATA, *PIPX_SPXCONNSTATUS_DATA;

ПараметрIPX„ADDRESS^NOTIFY

Этот параметр (тип optval — IPX_ADDRESS_DATA, версия Winsock 1+) можно только получить Он асинхронно уведомляет об изменении состояния связанного с IPX адаптера, что обычно происходит, когда ГВС-канал включается или разрывается. Для использования параметра требуется, чтобы вызывающая программа предоставила в параметре optval структуру IPX_ADDRESS_DATA Особенность в том, что сразу за структурой IPX_ADDRESS_DATA следует описатель занятого события. Вот один из вариантов вызова этого параметраchar buff[sizeof(IPX_ADDRESS_DATA) + sizeof(HANDLE)];

IPX_ADDRESS_DATA «ipxdata; HANDLE *hEvent;

lpxdata = (IPX_ADDRESS_DATA *)buff;

hEvent = (HANDLE *)(buff + sizeof(IPX_ADDRESS_DATA)); ipxdata->adapternum = 0 ; // укажите соответствующий адаптер •hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); setsockopt(s, NSPROTO_IPX, IPX_ADDRESS_NOTIFY, (char *)buff, sizeof(buff));

После успешного опроса getsockopt структура IPX ADDRESS DATA, на которую указывает optval, не изменится Вместо этого запрос помещается во внутреннюю очередь транспорта, а при изменении состояния адаптера IPX находит его и заполняет все поля в структуре IPX ADDRESS DATA. Затем событие, на которое ссылается описатель в буфере optval, помечается как свободное. Если одновременно выполняется несколько вызовов getsockopt, используйте разные события Событие применяется, поскольку запрос должен быть асинхронным, что на данный момент getsockopt не поддерживает

ВНИМАНИЕ! В текущей реализации транспорт сообщает только об одном поставленном в очередь запросе для каждого изменения состояния. Поэтому не запускайте больше одной службы, ставящей запросы в очередь

ПараметрIPXJAAX_ADAPTER_NUM

Этот параметр (тип optval — mt, версия Winsock 1+) можно только получить Он возвращает количеств адаптеров IPX Если при вызове возвращается п адаптеров, они нумеруются от О до п—\

ПараметрIPX_RERIPNETNUMBER

Этот параметр (тип optval IPX_NETNUM_DATA, версия Winsock 1+) можно только получить Он возвращает информацию о номере сети Напоминает IPX_GETNETINFO, но вынуждает IPX переиздавать RIP-запросы, даже если сеть находится в кэше (но не в случае, когда сеть присоединена напрямую) Как и IPX_GETNETINFO, IPX_NETNUM_DATA требует, чтобы optval указывал на структуруIPX_NETNUM_DATA

ПараметрIPX_RECEIVE_BROADCAST

Этот параметр (тип optval — BOOL, версия Winsock 1+) можно только задать По умолчанию IPX-сокет может принимать широковещательные пакеты Если этот параметр равен TRUE, широковещательные IPX-пакеты приниматься не будут Приложениям, которые не должны получать эти пакеты, следует присвоить IPXJZECEIVEjBROADCAST значение FALSE, чтобы увеличить быстродействие системы Впрочем, учтите, что это не обязательно вызовет фильтрацию широковещания для приложения

ПараметрIPXJMMEDIATESPXACK

Этот параметр (тип optval — BOOL, версия Winsock 1+) можно и получить, и задать Если присвоить ему JRUE, пакеты подтверждения для соединений SPX не будут задерживаться Это увеличивает количество АСК, но визуально ускоряет работу ряда программ

ФункцииloctlsocketиWSAIoctl

Сокетные ioctl-функции использую! для управления режимом ввода-выво- да, а также для получения сведений об ожидающем вводе-выводе Первая функция — loctlsocket, появилась в спецификации Winsock 1

int ioctlsocket ( SOCKET s, long cmd,

u_long FAR *argp

),

Параметр s — описатель сокета, который будет использоваться в дальнейшем, a cmd — предопределенный флаг для команды управления вводом-вы- водом, которая будет выполняться Последний параметр — argp, указатель на переменную, специфичную для данной команды После описания всех команд дается тип требуемой переменной

В Winsock 2 появилась функция toctl, которая добавляет несколько новых параметров Во-первых, она разбивает один параметр argp на набор вход-

i J I M D M a i l a p d M e i p b i с о к е т а и к о м а н д ы у п р а в л е н и и в в о д о м - в ы в о д о м

ных параметров для значений, переданных в функцию, и набор выходных параметров, используемых для возвращения данных из вызова Также вызов этой функции может использовать перекрытый ввод-вывод Функция называется WSAloctl и определена так

int WSAIoctK

 

SOCKET s,

 

DWORD

dwIoControlCode,

 

LPVOID

lpvInBuffer,

|

DWORD cblnBuffer,

 

LPVOID

lpvOutBuffer,

 

DWORD

cbOutBuffer,

*

LPDWORD lpcbBytesReturned,

LPWSAOVERLAPPED lpOverlapped,

LPWSAOVERLAPPED_C0MPLETION_ROUTINE lpCompletionRoutine

; >•

Первые два параметра совпадают с параметрами loctlsocket Следующие два — lpvInBuffer и cblnBuffer, описывают входные параметры Параметр lpvInBuffer — это указатель на передаваемое значение, a cblnBuffer — размер этих данных в байтах Аналогично параметры lpvOutBuffer и cbOutBuffer используются для возвращения данных из вызова Параметр lpvOutBuffer указывает на буфер данных, куда помещается любая возвращенная информация Параметр cbOutBuffer задает размер буфера из поля lpvOutBuffer в байтах Заметьте некоторые вызовы могут использовать только параметры ввода или вывода, а некоторые — и те, и другие Седьмой параметр — ipcbBytesRetumed, возвращает количество фактически возвращенных байт Последние два параметра — lpOverlapped и lpCompletionRoutine, используются при вызове этой функции с перекрытым вводом-выводом Подробнее о перекрытом вводе-выводе — в главе 8

Стандартные ioctl-команды

Эти три ioctl-команды < перекочевали» из мира Unix и употребляются чаще всего Они доступны на всех платформах Win32 и могут быть вызваны с использованием как loctlsocket, так и WSAloctl

КомандаFIONBIO

Используется с функциями loctlsocket и WSAloctl (версия Winsock 1+) Тип входного значения — unsigned Эта команда включает или отключает неблокирующий режим на сокете 5 По умолчанию все сокеты с момента создания — блокирующие Для включения неблокирующего режима при вызове loctlsocket с ioctl-командой FIONBIO задайте argp для передачи указателя на Длинное целое без знака с ненулевым значением Значение 0 переводит сокет в блокирующий режим Если вместо этого вы используете WSAloctl, просто передайте в качестве параметра lpvInBuffer длинное целое без знака

Вызов функции WSAAsyncSelect или WSAEventSelect автоматически разблокирует сокет, и любая попытка перевести его обратно в блокирующий реЖим вернет ошибку WSAEINVAL Чтобы вернуть сокет в блокирующий режим,

приложение должно сначала отключить WSAAsyncSelect, вызвав WSAAsyncSelect с параметром lEvent равным 0 Другой способ — отключить WSAEventSelect,

вызвав WSAEventSelect с параметром INetworkEvents, равным О

КомандаFIONREAD

Обе функции — toctlsocketn WSAIoctl (версия Winsock 1+), возвращают значение типа unsigned long, на входе ничего указывать не требуется Команда FIONREAD определяет количество данных, которые могут быть автоматически считаны с сокета Для toctlsocket значение argp выдается с длинным целым без знака и определяет количество байт, которое должно быть прочитано При использовании WSAIoctl целое без знака возвращается в ipvOutBuffer Если сокет s — поточный (SOCK_STREAM), FIONREAD возвращает конечное количество данных, которое можно прочитать в одном вызове функции приема Запомните использование этого или других механизмов приема сообщений не всегда гарантирует выдачу точного количества байт Когда эта ioctl-команда используется на дейтаграммном сокете (SOCKDGRAM), возвращаемое значение — размер первого сообщения, стоящего в очереди на сокете

КомандаSIOCATMARK

Обе функции (версия Winsock 1+) возвращают значение типа BOOL, на входе ничего указывать не требуется Команда SIOCATMARK определяет, были ли прочитаны внешние (out-of-band, OOB) данные После настройки сокета для приема ООВ-данных вместе с другими (с помощью параметра сокета SO_ OOBINLINE) эта ioctl-команда возвращает TRUE, если следующими должны быть прочитаны ООВ-данные Иначе возвращается FALSE и следующая операция приема вернет все или некоторые данные, которые предшествуют ООВ-данным Для toctlsocket указатель на булеву переменную возвращается в argp, а для WSAIoctl — в IpvOutBuffer Помните, что в одном вызове функции приема ООВ-данные никогда не смешиваются с остальными Подробнее об ООВ-данных — в главе 7

Другие ioctl-команды

Эти ioctl-команды специфичны для Winsock 2 кроме тех, которые работают с SSL и доступны только в Windows СЕ Если вы просмотрите заголовки Winsock 2, то фактически увидите объявление и других ioctl-команд Впрочем, только ioctl-команды, перечисленные в этом разделе, значимы для пользовательских приложений К тому же не все ioctl-команды работают на всех платформах Win32, хотя, конечно, это может измениться по мере обновлений ОС Для Winsock 2 большинство этих команд определено в Winsock2 h Некоторые из новейших ioctl-команд, специфичных для Windows 2000, определены в Mstcpip h

КомандаSIO_ENABLE_CIRCULAR_QUEUEING

Функция WSAIoctl (версия Winsock 2+) принимает и возвращает значение типа BOOL Эта ioctl-команда контролирует, как базовый поставщик службы

Г Л А В А Э 11араметры сокета и команды управления вводом-выводом

<к J

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

fются Когда этот параметр равен TRUE, вновь прибывшие сообщения не будут пропущены из-за переполнения буфера старые сообщения в очереди удаляются, чтобы освободить место для новых Эта команда допустима только для сокетов, связанных с ненадежными, ориентированными на сообщения протоколами Если она используется на сокете другого типа (например, поточном) или поставщик службы ее не поддерживает, выдается ошибка WSAENOPROTOOPT Этот параметр поддерживает только Windows NT/2000

Команда SIO_ENABLE CIRCULAR_QUEUEING также может быть использована для включения (выключения) цикличной очереди или с целью опроса текущего состояния параметра Чтобы задать значение, нужно использовать только входные параметры При опросе текущего значения параметра требуется только выходной параметр типа BOOL

КомандаSIO_FIND_ROUTE

Функция WSAIoctl (версия Winsock 2+) принимает значение типа SOCKADDR

ивозвращает значение типа BOOL Эта ioctl-команда используется для проверки, можно ли связаться с определенным адресом по сети Параметр IpvlnBuffer указывает на структуру SOCKADDR данного протокола Если адрес уже существует в локальном кэше, он становится недействительным Для IPX вызов функции WSAIoctl инициирует вызов IPX GetLocalTarget, который запрашивает в сети этот удаленный адрес К сожалению, поставщик Microsoft для текущих платформ Win32 не реализует эту команду

КомандаSIO_FLUSH

Функция WSAIoctl (версия Winsock 2+) не требует входных или выходных параметров Эта ioctl-команда определяет, были ли прочитаны ООВ-данные и отбрасывает текущее содержимое очереди отправки, связанной с данным сокетом В настоящее время этот параметр реализован только в Windows 2000 и NT 4 Service Pack 4

КомандаSIO_GET_BROADCAST_ADDRESS

Функции WSAIoctl (версия Winsock 2+) входные параметры не требуются Возвращается структура SOCKADDR (через ipvOutBuffer), содержащая широковещательный адрес для семейства адресов из сокета s, который может быть использован в sendto или WSASendTo Работает только в Windows NT/2000 Windows 9x возвращает ошибку WSAEINVAL

КомандаSIO_GET_EXTENSION_FUNCTION_POINTER

Функция WSAIoctl (версия Winsock 2+) принимает значение типа GUID и возвращает указатель на функцию Эта ioctl-команда используется для доступа к функциям, специфичным для поставщика, но не входящим в спецификацию Winsock Через нее поставщик может предоставить программистам доступ к функциям, назначив каждой из них GUID Затем приложение получит указатель на нужную функцию с помощью ioctl-команды SIO_GET_EX-

276

ЧАСТЬ II Интерфейс прикладного программирования Winsock

TENSION_FUNCTION POINTER Заголовочный файл Mswsock h определяет добавленные Microsoft функции Winsock, включая их GUID Например, чтобы выяснить, поддерживает ли установленный поставщик Winsock функцию TransmitFile, опросите его с использованием GUID

«define WSAID.TRANSMITFILE \ {0xb5367df0,Oxcbac,0x11cf,{0x95,Oxca,0x00,0x80,0x5f,0x48,0xa1,0x92}}

Получив указатель для функции расширения, например TransmitFile, вы сможете вызывать ее напрямую, без компоновки приложения с библиотекой Mswsock lib Это фактически исключит один промежуточный вызов функции, выполняемый в Mswsock lib

Вы можете найти в Mswsock h и другие специфичные для Microsoft расширения с определенными для них GUID Эта ioctl-команда — важная часть разработки многоуровневого поставщика службы Подробнее об интерфейсе поставщика службы — в главе 14

КомандаSIOJCHKJQOS

Функция WSAloctl (версия Winsock 2+) принимает и возвращает значение типа DWORD Эта ioctl-команда задает атрибуты QoS для данного сокета и может применяться для проверки шести состояний QoS Пока она поддерживается только в Windows 2000 Шести состояниям соответствуют флаги

ALLOWED JTO_SEND_DATA, ABLE TO RECV RSVP, LINEjRATE, LOCAL TRAFIЧС'_ CONTROL, LOCAL_QOSABILITYn ENDTO_END_QOSABILITY

Первый флаг — ALLOWED_TO_SEND_DATA, используется после задания уровней QoS на сокете с помощью SIO_SET_QOS, но до получения запроса резервирования (RESV) протокола RSVP Перед этим потоку, соответствующему сокету, обеспечивается лишь негарантированное (best-effort) обслуживание Получение сообщения RESV показывает, что требования к пропускной способности удовлетворены Подробнее о протоколе RSVP и резервировании сетевых ресурсов — в главе 12

Флаг ALLOWED TO SEND JDATA позволяет увидеть, достаточно ли негарантированного обслуживания для уровней QoS, запрошенных SIO_SET_QOS Возвращенное значение будет либо 1 — текущая негарантированная пропускная способность достаточна, либо 0 — пропускная способность не обеспечивает 1 ребуемые уровни Если флаг возвращает 0, приложение перед отправкой данных должно подождать, пока не будет получено сообщение RESV

Второй флаг — ABLE_TO_RECV RSVP, показывает, способен ли узел принимать и обрабатывать RSVP-сообщения на интерфейсе, с которым связан данный сокет Возвращаемое значение информирует, могут (1) или не могут (0) приниматься RSVP-сообщения

Следующий флаг — LJNE_RATE, возвращает негарантированную скорость передачи в Кбит/с Если скорость неизвестна, возвращается значение INFO__ NOT_AVAIIABLE

Последние три флага показывают, существуют ли определенные возможности на локальном компьютере или в сети Все три параметра выдают 1 если параметр поддерживается, 0 — если нет, INFO_NOT_AVAILABLE — если

Г Л А В А 9 Параметры сокета и команды управления вводом выводом

277

не существует способа проверки LOCAL TRAFFIC CONTROL используют, чтобы определить, установлен и доступен ли на компьютере компонент Traffic Control (управление трафиком) LOCAL_QOSABILITY определяет, поддерживается ли QoS на локальном компьютере И наконец, END_TO_END_QOSABIUTY показывает, допустимо ли применение QoS в локальной сети

КомандаSIO_GET_QOS

Функция WSAIoctl (версия Winsock 2+) возвращает значения типа QOS Эта ioctl-команда получает структуру QOS, связанную с сокетом Предоставленный буфер должен быть достаточно объемным, чтобы вместить в себя эту структуру целиком Между тем ее размеры в ряде случаев превышают sizeof(QOS), так как могут содержать информацию, специфичную для поставщика Подробнее о QoS — в главе 12 Если эта ioctl-команда используется на сокете, семейство адресов которого не поддерживает QoS, выдается ошибка WSAENOPROTO0PT Этот параметр и SIO_SET_QOS досгупны только на платформах, обеспечивающих QoS-совместимый транспорт, таких как Windows 98 и Windows 2000

КомандаSIOJSETJ3OS

Эта ioctl-команда составляет пару для SIO_GET_QOS Входной параметр для функции WSAIoctl (версия Winsock 2+) — структура QOS, которая определяет требования к пропускной способности для данного сокета Выходные значения не возвращаются Этот параметр и SIO_GET_QOS доступны только на платформах, обеспечивающих QoS-совместимый транспорт, таких как Windows 98 и Windows 2000

КомандаSIO„MULTIPOINTJ.OOPBACK

Функция WSAIoctl (версия Winsock 2+) принимает и возвращает значение типа BOOL и определяет, будут ли многоадресные данные возвращены на сокет При отправке группе данные по умолчанию поступают в очередь входящих сообщений исходного сокета Естественно, такая петля образуется, только если сокет также входит в целевую многоадресную группу В настоящее время это поведение характерно только для IP, но не для ATM Для отключения петли передайте FALSE во входном параметре ipvInBujfer Чтобы получить текущее значение этого параметра, оставьте входное значение равным NULL, а в качестве выходного параметра укажите булеву переменную

КомандаSIO_MULTICAST_$COPE

Функция WSAIoctl (версия Wmsock 2+) принимает и возвращает значение типа mt Эта ioctl-команда контролирует время жизни (или область распространения) многоадресных данных Область распространения — это количество маршрутизируемых сегментов сети, которые разрешено пересечь данным Значение по умолчанию — 1 Когда многоадресный пакет попадает в Маршрутизатор, значение TTL уменьшатся на 1 Когда TTL достигает 0, пакет отбрасывается Чтобы задать это значение, передайте целое с желае-