Главная страница

Программирование в сетях Windows. Э. Джонс, Д. Оланд


Скачать 2.88 Mb.
НазваниеЭ. Джонс, Д. Оланд
АнкорПрограммирование в сетях Windows.pdf
Дата12.10.2017
Размер2.88 Mb.
Формат файлаpdf
Имя файлаПрограммирование в сетях Windows.pdf
ТипКнига
#9346
страница25 из 50
1   ...   21   22   23   24   25   26   27   28   ...   50
Параметр 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 в локальной сети
1   ...   21   22   23   24   25   26   27   28   ...   50


написать администратору сайта