Программирование в сетях Windows. Э. Джонс, Д. Оланд
Скачать 2.88 Mb.
|
Параметр 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 { // Ввод Номер адаптера, начинающийся с О // Вывод Номер сети IPX // Вывод IPX-адрес узла // Вывод TRUE = адаптер на ГВС-канале // Вывод TRUE = связь по ГВС отсутствует (или адаптер // не связан с ГВС) // Вывод максимальный размер пакета, исключая заголовок // Вывод скорость связи в 100 байт/сек INT UCHAR UCHAR BOOLEAN BOOLEAN INT IPX t/LONG adapternum netnum[4], nodenum[6] wan, status, maxpkt; linkspeed; 2 7 0 ЧАСТЬ 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_RERIP- NETNUMBER, который всегда рассылает 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 в байтах Заметьте некоторые вызовы могут использовать только параметры ввода или вывода, а некоторые — и те, и другие Седьмой параметр — ipcbBytes- Retumed, возвращает количество фактически возвращенных байт Последние два параметра — 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 СЕ Если вы просмотрите заголовки Win- sock 2, то фактически увидите объявление и других ioctl-команд Впрочем, только ioctl-команды, перечисленные в этом разделе, значимы для пользо- вательских приложений К тому же не все ioctl-команды работают на всех платформах Win32, хотя, конечно, это может измениться по мере обновле- ний ОС Для Winsock 2 большинство этих команд определено в Winsock2 h Некоторые из новейших ioctl-команд, специфичных для Windows 2000, оп- ределены в Mstcpip h Команда SIO_ENABLE_CIRCULAR_QUEUEING Функция WSAIoctl (версия Winsock 2+) принимает и возвращает значение типа BOOL Эта ioctl-команда контролирует, как базовый поставщик службы f Г Л А В А Э 11араметры сокета и команды управления вводом-выводом <к J обрабатывает входящие дейтаграммные сообщения, если очередь заполне- на По умолчанию, в этом случае любые входящие дейтаграммы от брасыва- ются Когда этот параметр равен TRUE, вновь прибывшие сообщения не бу- дут пропущены из-за переполнения буфера старые сообщения в очереди удаляются, чтобы освободить место для новых Эта команда допустима толь- ко для сокетов, связанных с ненадежными, ориентированными на сообще- ния протоколами Если она используется на сокете другого типа (например, поточном) или поставщик службы ее не поддерживает, выдается ошибка WSAENOPROTOOPT Этот параметр поддерживает только Windows NT/2000 Команда SIO_ENABLE CIRCULAR_QUEUEING также может быть использова- на для включения (выключения) цикличной очереди или с целью опроса текущего состояния параметра Чтобы задать значение, нужно использовать только входные параметры При опросе текущего значения параметра тре- буется только выходной параметр типа BOOL Команда SIO_FIND_ROUTE Функция WSAIoctl (версия Winsock 2+) принимает значение типа SOCKADDR и возвращает значение типа BOOL Эта ioctl-команда используется для про- верки, можно ли связаться с определенным адресом по сети Параметр Ipvln- Buffer указывает на структуру 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 в локальной сети |