Программирование в сетях Windows. Э. Джонс, Д. Оланд
Скачать 2.88 Mb.
|
ГЛАВА 9 Параметры сокета и команды управления вводом выводом 261 struct l\ u_long Len, u_long CharSet, u_char UsrStr[IAS_MAX_USER_STRING], ы } lrdaAttnbUsrStr, } lrdaAttribute, } WINDOWS_IAS_QUERY, *PWINDOWS_IAS_QUERY, FAR *LPWINOOWS_IAS_QUERY, Структура запроса IAS для Windows СЕ typedef struct _WCE_IAS_QUERY { u_char irdaDeviceID[4], j char irdaClassName[61], char irdaAttnbName[61], u_short lrdaAttribType, union ''" { h int lrdaAttnblnt, tf struct jy { ° int Len, u_char 0ctetSeq[1], u_char Reserved[3], } lrdaAttribOctetSeq, struct { int Len, u_char CharSet, u_char UsrStr[1], u_char Reserved[2], 1 } lrdaAttnbUsrStr, } irdaAttribute, } WCE_IAS_QUERY *PWCE_IAS_QUERY, В табл 9-2 перечислены разные константы для поля irdaAttnbType, которое указываеа тип атрибута Значения для двух последних записей включены в таб лицу лишь для полноты информации Задать эти значения нельзя их может вернуть в поле trdaAttnblype вызов getsockopt с параметром 1R1MPJAS_QUERY Табл. 9-2. Типы атрибута IAS Значение irdaAttnbType Поле IAS_ATTR1B_INT lrdaAttnblnt IAS_A TTRIBOCTETSEQ h daAttrtbOctetSeq IAS_ATTRIBJTR IrdaAltrtbUvSti IAS ATTRIB NO CLASS Нет 1ASATTRIB NO ATTRIB Нет 2 6 2 ЧАСТЬ II Интерфейс прикладного программирования Winsock Чтобы задать значение, укажите в поле и daDevicelD ИК-устройство, для которого изменяется запись IAS Кроме гого, в поле irdaAttnbName следует задать класс, а в irdaClassName — службу для атрибута Помните, что при использовании IrSock серверы сокета — это службы, заре! истрированные средствами IAS, которым сопоставлен номер LSAP-SEL Данный номер кли- енты используют для соединения с сервером Для изменения номера LSAP-SEL входа службы IAS укажите в поле irda- DevicelD идентификатор устройства, на котором запущена служба В поле irdaAttnbName запишите строку IrDA IrLMP LsapSel, а в поле irdaClassName — имя службы (например, MySocketServer) Затем присвойте значение 1AS_ ATTR1BJNT полю irdaAttnbType, а в irdaAttnblnt укажите новый номер LSAP- SEL Конечно, номер LSAP-SEL лучше не изменять этот пример дан здесь лишь для наглядности Параметр IRLMPJRLPT_MODE Этот параметр (тип optval — BOOL, версия Winsock 1+) можно и получить, и задать Если он равен TRUE, сокет настроен для связи с ИК-принтерами Сред- ствами Winsock можно подключиться к инфракрасному принтеру и отпра- вить задание печати Для этого перед установлением связи переведите сокет в режим IRLPT Просто присвойте этому параметру значение TRUE после со- здания сокета Чтобы найти в пределах диапазона принтеры, поддерживающие инфракрас- ный режим, используйте параметр 1RLMP_ENUMDEV1CES Некоторые устаревшие ИК-принтеры не регистрируют себя в IAS, возможно, вам придется подключить- ся к ним напрямую по идентификатору < LSAP-SEL-XYX> (подробнее о способах обхода IAS — в главе 6) Этот параметр доступен в Windows СЕ/2000 Параметр \RLMP_SEND_PDU_LEN Этот параметр (тип optval — mt, версия Winsock 1+) можно только получить Он отображает максимальный размер блока данных протокола (Protocol Data Unit, PDU), необходимый при использовании параметра IRLMP_ 9WIRE_ MODE Более подробно этот параметр, доступный в Windows СЕ/2000, рас- смотрен в описании IRLMPJ)WIREJ4ODE Уровень параметров IPPROTOJP Параметры сокета на уровне IPPROTOJP относятся к специфичным атрибутам протокола IP, таким как изменение определенных полей в заголовке IP и добав- ление сокета к многоадресной группе IP Многие из этих параметров объявле- ны в Winsock h и Winsock2 h по-разному Заметьте, что при загрузке Winsock 1 необходимо включить правильный заголовок и компоновать приложение при- ложение с Wsock32 lib Аналогичным образом следует включить файл заголов- ка Winsock 2 и компоновать приложение с Ws2_32 lib для Winsock 2 Обсужда- емые в этом разделе параметры часто используются для многоадресного веща- ния, поддерживаемого обеими версиями Многоадресное вещание поддержи- вают все платформы Win32, кроме Windows СЕ до версии 2 1 Г Л А В А 9 Параметры сокета и команды управления вводом выводом 263 Параметр IPJOPTIONS Этот параметр (тип optval — char [] версия Winsock 1+) можно и пол\чить и задать Он позволяет задава гь разные параметры IP внутри заголовка IP He /'которые из возможных вариантов i Я ограничения обработки и защиты — со1ласно RFC 1108, Н запись маршрута — каждый маршрутизатор добавляет свой IP адрес к заголовку (см пример использования Ping в главе 13), • штамп времени — каждый маршрутизатор добавляет свой IP адрес и время, II нестрогая маршрутизация источника — пакет требуется для посеще ния каждого из перечисленных в заголовке параметра IP-адресов, • строгая маршрутизация источника — пакет требуется для посещения только тех IP-адресов, которые перечислены в заголовке параметра Учтите, что не все эти параметры поддерживаются узлами и маршрути- заторами Когда вы определяете параметр IP, данные, передаваемые в вызов setsockopt, следуют за структурой (рис 9-2) Допустимая длина заголовка па- раметра IP — до 40 байт < Код < » • Дяша < > Смещение < > До 40 байт >. Данные, специфичные для параметра -ft. f * >• 1 байт 1 байт 1 байт 37 байт Рис. 9-2. Формат заголовка параметра IP Поле кода указывает тип параметра например, значение 0x7 представля- ет параметр <запись маршрута) Длина — это просто длина заголовка пара- метра, а смещение — значение смещения в заголовок, где начинается фраг- мент данных заголовка Вид фрагмента данных заголовка зависит от конк- ретного параметра В приведенном далее отрывке кода мы задаем параметр <запись маршру- та) Сначала объявляем структуру (struct ip_option_hdi), содержащую первые три значения параметра (код, длина, смещение), а затем — данные парамет- ра Так как массив состоит из девяти длинных целых чисел без знака, мож- но записать до девяти IP-адресов Помните, что максимальный размер заго- ловка параметра IP составляет 40 байт Впрочем, наша структура занимает только 39 байт, поэтому система дополнит за вас заголовок до 32 разрядного слова (до 40 байт) struct ip_option_hdr { unsigned char code, unsigned char length, unsigned char offset, K 2 6 4 ЧАСТЬ II Интерфейс прикладного программирования Winsock unsigned long addrs[9], } opthdr, ZeroMemory((char *)&opthdr, sizeof(opthdr)); opthdr code = 0x7, opthdr length = 39; opthdr o f f s e t = 4, // Смещение на первый адрес (addrs) ret = setsockopt(s, IPPROT0_IP, IP_OPTIONS, (char *)&opthdr, sizeof(opthdr)); После того как параметр задан, он применяется к любым пакетам, отправ- ляемым на данный сокет Также для обнаружения заданных параметров вы мо- жете вызвать getsockopt с IPJDPTIONS, впрочем, при этом не будут возвращены данные, хранимые в специфичных для параметра буферах Для извлечения дан- ных, заданных в параметрах IP, необходимо использовать простые сокеты (SOCK_RAW) Или задать параметр IPJHDRINCL — тогда заголовок IP возвраща- ется вместе с данными после вызова функции приема данных Winsock Параметр IP_HDRINCL Этот параметр (тип optval — BOOL, версия Winsock 2+) можно и получить, и задать Если он равен TRUE, то функция отправки включит заголовок IP пе- ред посылаемыми данными, а функция приема — вернет этот заголовок вме- сте с данными Так что при вызове функции send Winsock включите полный заголовок IP перед данными и правильно заполните каждое поле заголовка (рис 9-3) Этот параметр доступен только в Windows 2000 4 бита заголовка еджбы fTOS) жизни 0Ttj восьмибитный Ш йрвгокш Полная дляна в байтах —* 18 бит три однобитны* флага 1б-5итная контрольная сумма заголовка 32-битныи ff-адоес поаучателя Параметры IP (вимвсть) Даннь» Рис. 9-3. Заголовок IP Г Л А В А 9 Параметры сокета и команды управления вводом выводом 265 Первое поле заголовка — версия IP (на данный момент, версия 4) Длина заголовка — количество 32-битных слов в заголовке Заголовок IP всегда должен быть кратен 32 бшам Следующее поле — тип службы, подробнее о котором — в описании па- раметра сокета IP_TOS Поле полной длины выражает длину заголовка IP и данных в байтах, а затем идет уникальный идентификатор каждого о т р а в - ленного IP-пакета Как правило, система увеличивает это значение с отправ- кой каждого пакета Поля флагов и смещения используются при разбивке IP- пакетов на пакеты меньшего размера Время жизни (поле TTL) ограничива- ет количество маршрутизаторов, через которые может пройти пакет При отправке пакета поле TTL каждый раз уменьшается маршрутизатором на 1, и когда значение достигает 0, передача прекращается Это ограничивает вре- мя, в течение которого пакет может передаваться по сети Поле протокола используется для демультиплексирования входящих пакетов Вот несколько допустимых протоколов, которые используют адресацию IP TCP, UDP, IGMP и1СМР Далее идет 16-битная контрольная сумма заголовка Она рассчитывается только для заголовка, без учета данных Следующие два поля — 32-битные IP-адреса отправителя и получателя Поле параметров IP имеет переменную длину и содержит дополнительные сведения (обычно о защите или марш- рутизации) Самый простой способ отправить заголовок IP вместе с данными — оп- ределить структуру, содержащую заголовок IP и данные, и передать ее в вы- зов send Этот параметр работает только в Windows 2000 (подробнее — в главе 13) Параметр IPJTOS Этот параметр (тип optval — int, версия Winsock 1+) можно и получить, и задать Он представляет собой тип службы (type of service, TOS) — поле в заголовке IP, используемое для обозначения некоторых характеристик па- кета Длина поля — 8 бит, оно разбито на три части трехбитное поле стар- шинства (которое игнорируется), четырехбитное поле TOS, и оставшийся бит (который должен быть равен 0) Назначение четырех бит TOS — сокра- тить задержку, увеличить производительность, повысить надежность и со- кратить издержки, причем одновременно нельзя задать более одного бита Если значение всех четырех бит равно 0, то подразумевается обычное обслу- живание RFC 1340 определяет биты, рекомендуемые для разных стандарт- ных приложений типа TCP, SMTP, NNTP и т п В RFC 1349 исправлены неко- торые положения RFC 1340 Для интерактивных приложений (например, Rlogin или Telnet) может потребоваться сократить задержку Для любого вида передачи файлов, на- пример, FTP, важна максимальная производительность, а высокая надеж- ность необходима для управления сетью (SNMP) и протоколов маршрутиза- ции Наконец, новости Usenet (NNTP) — пример снижения издержек Пара- метр IPJTOS не доступен в Windows СЕ 2 6 6 ЧАСТЬ II Интерфейс прикладного программирования Winsock При установке бит TOS на сокете, поддерживающем QoS, возникает до- полнительная проблема. Поскольку QoS использует старшинство IP для раз- личения уровней обслуживания, изменение этих значений разработчиками нежелательно. Поставщик услуг QoS перехватит вызов setsockopt с IPJTOS на QoS-сокете, чтобы проверить возможность замены. Подробнее о QoS — в главе 12. Параметр IPJTTL Этот параметр (тип optval — int, версия Winsock 1+), представляющий собой IP-параметр времени жизни, можно и получить, и задать. Поле времени жиз- ни (time-to-live, TTL) представлено в заголовке IP. Дейтаграмма использует поле TTL, чтобы ограничить количество маршрутизаторов, через которые она может пройти, дабы предотвратить циклы маршрутизации (когда дей- таграмма передается по кругу). Каждый маршрутизатор, через который про- ходит дейтаграмма, уменьшает ее поле TTL на 1. После обнуления TTL дей- таграмма отбрасывается. Этот параметр не доступен в Windows СЕ. Параметр IP_MULTICAST_IF Этот параметр многоадресного интерфейса (тип optval — unsigned long, версия Winsock 1+) и получает, и задает локальный интерфейс, откуда ло- кальный компьютер может отправлять любые данные для группы. Его имеет смысл использовать только на компьютерах с несколькими сетевыми ин- терфейсами (сетевыми адаптерами, модемами и т. п.). Параметр optval дол- жен быть длинным целым без знака, представляющим двоичный IP-адрес локального интерфейса. Для преобразования строкового адреса в десятич- но-точечной нотации в длинное целое без знака используйте функцию inet_addr. DWORD mcastIF; // Сначала присоедините сокеты к многоадресной группе mcastIF = inet_addr("129.113.43.120"); ret = setsockopt(s, IPPR0T0_IP, IP_MULTICAST_IF, (char *)&mcastIF, sizeof(mcastlF)); Параметр IP_MULTICAST_TTL Этот параметр (тип optval — int, версия Winsock 1+) можно и получить, и задать. Он определяет время жизни на пакетах многоадресной рассылки для этого сокета и напоминает уже знакомый вам TTL IP, но в отличие от последнего, применяется только к групповым данным, отправленным с дан- ного сокета. TTL также предотвращает циклы маршрутизации, но при мно- гоадресном вещании сужает область распространения данных. Поэтому для получения дейтаграмм члены многоадресной группы должны нахо- диться в пределах «диапазона». Стандартное значение TTL для групповых дейтаграмм — 1. Г Л А В А 9 Параметры сокета и команды управления вводом-выводом 267 Параметр IP_MULTICAST_LOOP Этот параметр (тип optval — BOOL, версия Winsock 1+) можно и получить, и задать. Если он равен TRUE (по умолчанию), то данные, отправленные на групповой адрес, будут отражены во входящем буфере сокета. Если присво- ить этому параметру значение FALSE, то никакие отправленные сокетом дан- ные не попадут в его очередь входящих данных. Параметр IP_ADD_MEMBERSHIP Этот параметр (тип optval — struct ipjnreq, версия Winsock 1+) можно толь- ко задать — это способ добавить сокет к многоадресной группе IP в Winsock 1. Создайте сокет с семейством адресов AFJNET и типом SOCKJDGRAM в вы- зове функции socket. Для добавления сокета в многоадресную группу, исполь- зуйте структуру: struct ipjnreq { struct in_addr imrjnultiaddr; struct m_addr imr_interface; >; Здесь поле imrjnultiaddr — двоичный групповой адрес, a imr_interface — локальный интерфейс, на котором следует отправлять и получать групповые данные Подробнее о допустимых групповых адресах — в главе 11. Поле imrjnterface — двоичный IP-адрес локального интерфейса, либо значение INADDR_ANYдля выбора интерфейса по умолчанию. Параметр IP_DROP_MEMBERSHIP Этот параметр (тип optval — struct ipjnreq, версия Winsock 1+) можно толь- ко задать. Он противоположен по назначению IP_ADD_MEMBERSHIP и уда- ляет сокет из данной группы IP. При его вызове со структурой ipjnreq, со- держащей значения, которые использовались для регистрации в данной группе, сокет 5 будет удален из нее. Подробнее — в главе 11. Параметр IP_DONTFRAGMENT Этот параметр (тип optval — BOOL, версия Winsock 1+) можно и получить, и задать. Если он равен TRUE, сети запрещается фрагментировать дейтаграм- му IP в ходе передачи. Впрочем, если размер дейтаграммы больше макси- мального блока передачи даннълх (maximum transmission unit, MTU) и флаг IP «не фрагментировать» задан внутри заголовка IP, отправка будет приос- тановлена и появится сообщение об ошибке ICMP и необходимости фраг- ментации. Эта параметр не доступен в Windows СЕ. Уровень параметров IPPROTOJTCP К этому уровню относится лишь один параметр, применимый только к пото- ковым сокетам (SOCK_STREAM), принадлежащим к семейству адресов AFJNET. Он доступен во всех версиях Winsock и поддерживается всеми платформа- Ми Win32. 2 6 8 ЧАСТЬ 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 |