Программирование в сетях Windows. Э. Джонс, Д. Оланд
Скачать 2.88 Mb.
|
dwEchoReps — количество ответов на эхо-сообщения; • dwTimestamps — количество штампов времени; • dwTimestampReps — количество ответов на штампы времени; Ш dwAddrMasks — количество масок адресов; • dwAddrMaskReps — количество ответов на маски адресов. Третья функция — GetTcpStatistics, служит для получения статистики прон токола TCP: 560 Приложение В Вспомогательные фумрри IP DWORD G e t T c p S t a t i s t i c s ( . JJ^J \1 , О Ш Щ « ЯН>1 PMIB TCPSTATS p S t a t s Параметр pStats — указатель на структуру MIBJTCPSTATS, куда помещает- ся статистика: typedef struct _MIB_TCPSTATS { DWORD dwRtoAlgorithm; DWORD dwRtoMin; DWORD dwRtoMax; DWORD dwMaxConn; DWORD dwActiveOpens; DWORD dwPassiveOpens; DWORD dwAttemptFails; DWORD dwEstabResets; DWORD dwCurrEstab; DWORD dwInSegs; DWORD dwOutSegs; DWORD dwRetransSegs; DWORD dwInErrs; DWORD dwOutRsts; DWORD dwNumConns; } MIB_TCPSTATS, *PMIB_TCPSTATS; Структура MIBJTCPSTATS содержит следующие поля: • dwRtoAlgorithm — используемый алгоритм ретрансляции; допустимые зна- чения: M1BJCPRTO CONSTANT, MIB_TCP_RTO_RSRE, MIB_TCP_RTO_VANJ и MIB_TCP_RTO_OTHER; Ш dwRtoMin — м и н и м а л ь н ы й л и м и т в р е м е н и для р е т р а н с л я ц и и в милли- секундах; Ш dwRtoMax — максимальный л и м и т в р е м е н и для р е т р а н с л я ц и и в милли- секундах; Ш dwMaxConn — максимально допустимое число подключений; Ш dwActiveOpens — количество подключений к серверу, и н и ц и и р о в а н н ы х д а н н ы м компьютером; Ш dwPassiveOpens — количество подключений клиентов к д а н н о м у ком- пьютеру; * • dwAttemptFails — количество сбоев п р и подключении; • Ш Ш dwEstabResets — количество с б р о ш е н н ы х подключений; \ Ш Ш dwCurrEstab — количество текущих подключений; • dwInSegs — количество полученных сегментов; • dwOutSegs — количество отправленных (в том числе повторно) сегментов; |i dwRetransSegs — количество п о в т о р н о о т п р а в л е н н ы х сегментов; • dwInErrs — количество сбоев п р и приеме; Приложение В Вспомогательные функции IP 561 Ш dwOutRsts — количество сегментов, переданных с флагом сброса; Ш dwNumConns — общее количество подключений. Последняя функция — GetUdpStatistics, служит для получения статистики протокола UDP: DWORD GetUdpStatistics( PMIB_UDPSTATS pStats ); Параметр pStats — это указатель на структуру MIBJJDPSTATS, куда поме- щается статистика: typedef struct .MIBJJDPSTATS { DWORD dwInDatagrams; DWORD dwNoPorts; DWORD dwInErrors; DWORD dwOutDatagrams; DWORD dwNumAddrs; } MIB_UDPSTATS,*PMIB_UDPSTATS; Структура MIBJJDPSTATS содержит следующие поля: Ш dwInDatagrams — количество полученных дейтаграмм; Ш dwNoPorts — количество дейтаграмм, отброшенных из-за отсутствия ПОрТОВ; Ш dwInErrors — количество ошибок при получении дейтаграмм (исключая dwNoPorts); Ш dwOutDatagrams — количество переданных дейтаграмм; • dwNumAddrs — общее количество записей в таблице прослушиваемых портов UDP. Возможности утилиты Route Утилита Route.exe позволяет получать и редактировать таблицу маршрутов. Эта таблица определяет, какой из интерфейсов IP будет использован для обработки запроса или дейтаграммы. Библиотека вспомогательных IP-функ- ций предлагает несколько функций для работы с таблицей маршрутов. Все они доступны в Windows 98, Windows 2000 и Windows NT 4 с Service Pack 4 (и выше). Основное предназначение утилиты Route.exe — получение таблицы маршрутизации. Маршрут состоит из адреса подключаемого компьютера, маски подсети, шлюза, локального IP-интерфейса и метрики. С помощью утилиты можно также добавлять и удалять маршруты. Для добавления мар- шрута надо задать все перечисленные параметры, для удаления — только адрес подключенного компьютера. 5 6 2 Приложение В Вспомогательные функции IP Получение таблицы маршрутов Программно получить таблицу маршрутов можно с помощью функции Get- IpForwardTable-. DWORD GetlpForwardTable ( 1" PMIB_IPFORWARDTABLE pIpForwardTable, щ PULONG pdwSize, BOOL border ; ( ); Ее первый параметр — pIpForwardTable, это указатель на буфер в прило- жении, куда будет помещена таблица. Второй параметр — pdwSize, размер этого буфера. Если при вызове функции этот параметр равен NULL или раз- мера буфера не достаточно, то в параметре pdwSize возвращается необхо- димый размер. Последний параметр — bOrder, указывает, будет ли инфор- мация отсортирована. По умолчанию информация сортируется так: 1. Адрес подключаемого компьютера. 2. Протокол маршрута. 3. Политика маршрутизации нескольких путей. ТУ") 4. Адрес следующего узла. i " т Информация о маршрутизации возвращается в виде структуры MIBJP- FORWARDTABLE: Ш typedef struct _MIB_IPFORWARDTABLE m i Ш DWORD dwNumEntries; MIB_IPFORWARDROW tabletANY.SIZE]; » } MIB_IPFORWARDTABLE, •PMIB_IPFORWARDTABLE; ц Эта структура содержит массив структур MIBJPFORWARDROW. Поле dw- NumEntries определяет их количество в этом массиве. Структура MIBJP- FORWARDROWимеет вид: typedef struct _MIB_IPFORWARDROW { DWORD dwForwardDest; DWORD dwForwardMask; DWORD dwForwardPolicy; DWORD dwForwardNextHop; DWORD dwForwardlflndex; DWORD dwForwardType; DWORD dwForwardProto; DWORD dwForwardAge; DWORD dwForwardNextHopAS; DWORD dwForwardMetnd; DWORD dwForwardHetric2; DWORD dwForwardMetnc3; DWORD dwForwardMetric4; DWORD dwForwardMetric5; } HIB_IPFORWARDROW, «PMIB.IPFORWARDROW; Приложение В Вспомогательные функции IP 563 Структура MIBJPFORWARDROW содержит следующие поля: dwForwardDest — IP-адрес конечного узла. dtvForwardMask — маска подсети конечного узла. dwForwardPolicy — задает набор условий для выбора маршрута (см. RFC 1354), обычно представляемых в форме IP Type of Service (TOS). dwForwardNextHop — IP-адрес следующего узла в маршруте. dwForwardlflndex — номер интерфейса для данного маршрута. divForwardType — тип маршрута согласно RFC 1354; возможные значения: Ш MIB_IPROUTE_ TYPEINDIRECT — следующий узел не является конеч- ным пунктом (дальний маршрут); Ш MIBIPROUTE TYPE DIRECT — следующий узел является конечным пунктом (локальный маршрут); « MIBIPROUTETYPE INVALID — неверный маршрут; Ш MIB IPROUTETYPEOTHER — другой. dwForwardProto — протокол маршрута; возможные значения (для про- токолов IPX определены в файле Routprot.h, для IP — в файле Iprtrmib.h). II MIB IPPROTO OTHER — неизвестный протокол; Ш MIBIPPROTOLOCAL — маршрут, сгенерированный стеком; Ш MIBIPPROTONETMGMT — маршрут, добавленный утилитой Route.exe или SNMP; К MIB IPPROTO ICMP — маршрут от перенаправления ICMP; Ш MIB IPPROTO EGP — протокол Exterior Gateway Protocol; IS MIBIPPROTOGGP — протокол Gateway Gateway Protocol; И MIB IPPROTO HELLO — протокол HELLO; Ш MIBIPPROTORIP — протокол Routing Information Protocol; • MIBIPPROTOISJS — соединение IP Intermediate System и Intermediate System Protocol; Ш MIBJPPROTOESIS — соединение IP End System и Intermediate System Protocol; Ш MIBIPPROTO CISCO - протокол IP Cisco; Ш MIBIPPROTO BBN — протокол BBN; И MIB IPPROTOOSPF — протокол Open Shortest Path First; В MIBIPPROTOBGP — протокол Border Gateway Protocol; Ш MIB IPPROTONT AUTOSTATIC — динамический маршрут, добавлен- ный протоколом маршрутизации; Ш MIBIPPROTO NT STATIC — маршруты, добавленные с помощью пользовательского интерфейса или утилитой Routemon.exe; Ш MIB IPPROTO STATIC NON DOD — то же, что и PROTO_IP_NT_STATIC, кроме маршрутов, не вызывающих запрос Dial on Demand (DOD); И IPXPROTOCOLRIP — протокол Routing Information Protocol for IPX; 5 6 4 Приложение В Вспомогательные функции IP Н IPXPROTOCOLSAP — протокол Service Advertisement Protocol; • IPXPROTOCOLNLSP — протокол Netware Link Services Protocol. I • dwForwardAge — время жизни маршрута в секундах. •• Ш dwForwardNextHopAS — автономный системный номер следующего узла. Ш dtvForwardMetricl — зависящий от вида протокола параметр-метрика (подробнее — в RFC 1354); это значение отображается при запуске ути- литы Route.exe с параметром print. ПРИМЕЧАНИЕ Если этот параметр (а также следующие четыре) не ис- пользуется, то его значение будет равно MIBJPROUTE_METRICJJNUSED ' (??). • dwForwardMetric2, du>FonvardMetric3, dwForwardMetric4 и dwFor- wardMetricS — параметры, зависящие от вида протокола (подробнее — в RFC 1354). ч Добавление маршрута Следующая функция утилиты Route.exe — добавление маршрута. Для этого необходимо задать IP-адрес подключаемого узла, маску подсети, шлюз, ло- кальный интерфейс IP и метрику, проверив правильность параметров ло- кального IP-интерфейса. Ссылаться на локальный IP-интерфейс надо по его внутреннему коду, который можно определить с помощью следующей функ- ции GetlpAddrTable: DWORD GetlpAddrTable ( PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize, BOOL border ); Ее первый параметр — pIpAddrTable, указатель на буфер в приложении, куда будет помещена структура MIBJPADDRTABLE. Второй параметр — pdw- Size, задает размер этого буфера. Если при вызове функции этот параметр задан равным NULL или размера буфера не достаточно, то в параметре pdw- Size возвращается необходимый размер. Последний параметр — bOrder, ука- зывает, будут ли локальные IP-интерфейсы отсортированы по возрастанию IP-адресов. Структура MIBJPADDRTABLE имеет вид: typedef struct _MIB_IPADDRTABLE { DWORD dwNumEntries MIB_IPADDRROW table[ANY_SIZE]; } MIB_IPADDRTABLE, •PMIB_IPADDRTABLE; Эта структура содержит массив структур MIBJPADDRROW. Поле dwNum- Entries определяет их количество в массиве. Код структуры MIBJPADDRROW следующий: Приложение В Вспомогательные функции IP 565 typedef struct _MIB_IPADDRROW DWORD DWORD DWORD DWORD DWORD unsigned unsigned dwAddr; dwlndex; dwMask; dwBCastAddr; dwReasmSize; short unused"!; short unused2; MIB_IPADDRROW, *PMIB_IPADDRROW; Структура MIBJPADDRROW содержит следующие поля: • dwAddr — IP-адрес для данного интерфейса; • dwlndex — код данного интерфейса; Ш dwMa.sk — маска подсети для данного IP-адреса; Ш dwBCastAddr — адреса рассылки; Ш dwReasmSize — максимальный размер сборки для принимаемых дейтаг- рамм; Ш unused 1 и unused2 — не используются. С помощью этой функции можно определить, правильны ли параметры локального IP-интерфейса. Чтобы добавить маршрут в таблицу, воспользуй- тесь функцией SetlpForwardEntty: DWORD SetlpForwardEntry ( PMIB_IPFORWARDROW pRoute ); Ее единственный параметр — pRoute, указатель на структуру MIBJPFOR- WARDROW. Для добавления маршрута должны быть заданы значения полей dwForwardlflndex, dwForwardDest, dwForwardMask, divForwardNextHop и dw- ForwardPolicy. Удаление маршрута Удаление маршрута — простейшая операция Route. Для этого надо задать только адрес подключавшегося компьютера. Соответствующая этому адре- су структура MIBJPFORWARDROWвозвращается функцией GetlpForwardTable и передается функции DeletelpForwardEntry, удаляющей маршрут: DWORD DeletelpForwardEntry ( PMIB_IPFORWARDROW pRoute ); Можно вручную задать необходимые поля параметра pRoutе-. dwForward- lflndex, dwForwardDest, dwFonvardMask, dwForwardNextHop и dwFonvardPolicy. Утилита ARP Эта утилита используется для просмотра и редактирования кэша ARP. При- мер из Platform SDK, эмулирующий ее работу с помощью вспомогательных 5 6 6 Приложение В Вспомогательные функции IP функций IP, называется Iparp.exe. Протокол ARP отвечает за разрешение IP- адреса в физический МАС-адрес. Для увеличения производительности ком- пьютер хранит эту информацию в кэше, и к ней можно получить доступ с помощью утилиты Агр.ехе. Утилита позволяет вывести таблицу ARP (с пара- метром -а), удалить запись (с параметром -d) или добавить запись (с пара- метром -s). Рассмотрим соответствующие функции. Они доступны в Windows 98, Windows 2000 и Windows NT 4 с Service Pack 4 (и выше). Получить таблицу ARP позволяет функция GetlpNetTable: ^ DWORD GetlpNetTable ( PMIB_IPNETTABLE pIpNetTable, PULONG pdwSize, * BOOL border I ); Ее первый параметр — pIpNetTable, указатель на буфер в приложении, куда будет помещена структура MIBJPNETTABLE. Второй параметр — pdwSize, размер этого буфера. Если при вызове функции этот параметр равен NULL или размера буфера недостаточно, то в параметре pdwSize возвращается не- обходимый размер буфера (при этом сама функция возвращает значение ERRORJNSUFFLCLENTBUFFER). Последний параметр — bOrder, указывает, будут ли записи отсортированы по возрастанию IP-адресов. Структура М1В_ IPNETTABLE имеет следующий вид: typedef struct _MIB_IPNETTABLE { DWORD dwNumEntries; ,; MIB_IPNETROW tabletANY_SIZE]; > MIB IPNETTABLE, *PMIB IPNETTABLE; T Эта структура содержит массив структур MLBJPNETROW. Поле Entries определяет их количество в этом массиве. Каждая структура NETR0W содержит одну запись ARP: typedef struct _MIB_IPNETROW { * DWORD dwlndex; -» DWORD dwPhysAddrLen; BYTE bPhysAddr[MAXLEN_PHYSADDR]; DWORD dwAddr; DWORD dwType; '* } MIB_IPNETROW, *PMIB_IPNETROW; ,-1 Структура MLB LPNETROW содержит следующие поля. К dwlndex — код адаптера. II dwPhysAddrLen — длина физического адреса в байтах. • bPhysAddr — массив байт, содержащий физический (MAC) адрес адаптера. • dwAddr — IP-адрес адаптера. • dwType — тип записи ARP; возможные значения: Приложение В Вспомогательные функции IP 567 Ж MIBJPNETJYPE STATIC— статическая запись; Ш MIBJPNETJTYPEJDYNAMIC — динамическая запись; • MIBJPNETJYPEJNVAUD — недействительная запись; Ш MIB_IPNET_TYPE_OTHER — иной тип. Добавление записи ARP Для добавления записи ARP предназначена функция SetlpNetEntry: DWORD SetlpNetEntry ( PMIB.IPNETROW pArpEntry Ее единственный аргумент — рассмотренная структура MIBJPNETROW, в которой должны быть заданы необходимые поля. В поле dwlndex указыва- ют код локального IP-адреса сети, к которой применяется запись ARP. Этот код для каждого IP-адреса можно определить с помощью функции Getlp- AddrTable. Следующее поле — dwPhysAddrLen, обычно равно 6. (Большинство физических адресов, в частности, МАС-адреса ETHERNET занимают б байт) Массив байт bPhysAddr содержит физический адрес. Большинство МАС-ад- ресов представляются в виде 12 символов и должны быть переведены в со- ответствующий двоичный вид. Например МАС-адрес 00-А0-С9-А7-86-Е8 бу- дет представлен как 00000000 10100000 11001001 10100111 10000110 11101000 Метод кодирования аналогичен применяемому для кодирования адресов IPX и ATM (см. главу б). Поле dwAddr должно содержать IP-адрес узла, для которого задавался МАС-адрес. В последнем поле — dwType, указывается тип записи. После заполнения необходимых полей структуры вызывается функ- ция SetlpNetEntry. Если запись успешно добавлена, возвращается значение NOERROR. Удаление записи ARP Для удаления записи требуется только задать в структуре MIBJPNETROW код интерфейса dwlndex и IP-адрес удаляемой записи dwAddr. Затем вызывает- ся функция DeletelpNetEntry. DWORD DeletelpNetEntry ( PMIB_IPNETROW pArpEntry Напомним, что код для локального интерфейса IP можно получить с по мощью функции GetlpAddrTable. Если удаление записи успешно, функци DeletelpNetEntry возвращает значение NOJ1RROR. П Р И Л О Ж Е Н И Е Коды ошибок Winsock В приложении перечислены коды ошибок Winsock, отсортированные по но- мерам В список не включены специфичные и недокументированные ошиб- ки Winsock Ошибки Winsock, непосредственно соответст вующие ошибкам Win32, перечислены в конце приложения |