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

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

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

558

Приложение В Вспомогательные функции IP

Структура MIBIPSTATS содержит следующие поля:

ШdwForwarding указывает, включено или нет на данном компьютере IPперенаправление;

ШdwDefaultTTL — начальное время TTL для отправляемых с данного компьютера дейтаграмм;

ШdwlnReceives количество полученных дейтаграмм;

ШdwInHdrErrors количество дейтаграмм, полученных с ошибками в заголовках;

dwIttAddrErrors количество дейтаграмм, полученных с ошибками в адресах;

dwForwDatagrams — количество перенаправленных дейтаграмм;

dwlriUnknownProtos количество дейтаграмм, полученных с неизвест-

ными протоколами;

'

dwInDiscards — количество отброшенных дейтаграмм;

ШdwInDelivers количество доставленных дейтаграмм;

Ш dwOutRequests количество дейтаграмм с запросами на вывод;

;(

dwRoutingDiscards количество отброшенных маршрутов;

,

dtvOutDiscards — количество отброшенных выходных дейтаграмм;

*;

dwOutNoRoutes количество выходных дейтаграмм без маршрута;

Н dwReasmtimeout максимальное время для приема фрагментированных дейтаграмм;

ШdwReasmReqds количество дейтаграмм, потребовавших сборки;'

dwReasmOks количество успешно собранных дейтаграмм;

dwFragFails — количество сбоев при фрагментации дейтаграмм;

dwFragCreates количество фрагментированных дейтаграмм;

dwNumlf— количество доступных на данном компьютере 1Р-интерфей-

СОВ;

divNumAddr — количество IP-адресов, назначенных данному компьютеру;

ШdwNumRoutes количество маршрутов в таблице маршрутизации.

Вторая функция — GetlcmpStatistics, служит для получения статистики протокола Internet Control Message Protocol (ICMP):

DWORD GetIcmpStatistics(

PMIB_ICMP pStats

);

Параметр pStats — указатель на структуру MIBJCMP, куда помещается статистика ICMP:

typedef struct _MIB_ICMP

{

MIBICMPINFO stats; } MIBJXMP, •PMIB.ICMP;

Приложение В Вспомогательные функции IP

559

Как видно, MIBICMP содержит структуру MIBICMPINFO-.

typedef struct _MIBICMPINFO

{

MIBICMPSTATS icmpInStats; MIBICMPSTATS icmpOutStats;

} MIBICMPINFO;

Структура MIBICMPINFO, в свою очередь, содержит две структуры типа MIBICMPSTATS, icmpInStats —- для статистики по входящей информации ICMP и icmpOutStats — для исходящей:

typedef struct .MIBICMPSTATS

 

<

 

 

;.-•

 

DWORD

dwMsgs;

 

 

DWORD

dwErrors;

 

 

DWORD

dwDestUnreachs;

''

 

DWORD

dwTimeExcds;

 

 

DWORD

dwParmProbs;

«

 

DWORD

dwSrcQuenchs;

 

i

DWORD

dwRedirects;

... .

 

DWORD

dwEchos;

 

 

DWORD

dwEchoReps;

 

1DWORD dwTimestamps;

iDWORD dwTimestampReps; DWORD dwAddrMasks; DWORD dwAddrMaskReps;

}MIBICMPSTATS;

Структура MIBICMPSTATS содержит следующие поля:

dwMsgs — количество посланных или полученных сообщений;

ШdwErrors — количество произошедших ошибок;

dwDestUnreachs — количество сообщений о том, что адрес не доступе] i

ШdwTimeExcds — количество превышений сроков;

dwParmProbs количество сообщений, содержавших неверные параметры IP;

ШdwSrcQuencbs — количество просьб снизить скорость;

dwRedirects — количество переадресаций;

ШdwEchos — количество эхо-сообщений ICMP;

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 pStats

 

 

Параметр 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:

DWORDGetUdpStatistics( PMIB_UDPSTATS pStats

);

Параметр pStats — это указатель на структуру MIBJJDPSTATS, куда помещается статистика:

typedef struct .MIBJJDPSTATS

{

DWORDdwInDatagrams;

DWORDdwNoPorts;

DWORDdwInErrors;

DWORDdwOutDatagrams;

DWORDdwNumAddrs;

} 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-интерфейса и метрики. С помощью утилиты можно также добавлять и удалять маршруты. Для добавления маршрута надо задать все перечисленные параметры, для удаления — только адрес подключенного компьютера.

562

Приложение В Вспомогательные функции 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

 

i

 

 

Ш

 

DWORD

dwNumEntries;

 

 

MIB_IPFORWARDROW

tabletANY.SIZE];

 

}

MIB_IPFORWARDTABLE,

•PMIB_IPFORWARDTABLE;

 

Эта структура содержит массив структур MIBJPFORWARDROW. Поле dwNumEntries определяет их количество в этом массиве. Структура MIBJPFORWARDROWимеет вид:

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;

564 Приложение В Вспомогательные функции 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 и dwForwardMetricS — параметры, зависящие от вида протокола (подробнее — в RFC 1354).

ч

Добавление маршрута

Следующая функция утилиты Route.exe — добавление маршрута. Для этого необходимо задать IP-адрес подключаемого узла, маску подсети, шлюз, локальный интерфейс IP и метрику, проверив правильность параметров локального IP-интерфейса. Ссылаться на локальный IP-интерфейс надо по его внутреннему коду, который можно определить с помощью следующей функции GetlpAddrTable:

DWORD GetlpAddrTable ( PMIB_IPADDRTABLE pIpAddrTable, PULONG pdwSize,

BOOL border

);

Ее первый параметр — pIpAddrTable, указатель на буфер в приложении, куда будет помещена структура MIBJPADDRTABLE. Второй параметр — pdwSize, задает размер этого буфера. Если при вызове функции этот параметр задан равным NULL или размера буфера не достаточно, то в параметре pdwSize возвращается необходимый размер. Последний параметр — bOrder, указывает, будут ли локальные IP-интерфейсы отсортированы по возрастанию IP-адресов. Структура MIBJPADDRTABLE имеет вид:

typedef struct _MIB_IPADDRTABLE

{

DWORD dwNumEntries MIB_IPADDRROW table[ANY_SIZE];

} MIB_IPADDRTABLE, •PMIB_IPADDRTABLE;

Эта структура содержит массив структур MIBJPADDRROW. Поле dwNumEntries определяет их количество в массиве. Код структуры MIBJPADDRROW следующий:

Приложение В Вспомогательные функции IP

565

typedef struct _MIB_IPADDRROW

DWORD dwAddr; DWORD dwlndex;

DWORD dwMask; DWORD dwBCastAddr; DWORD dwReasmSize;

unsigned short unused"!; unsigned short unused2;

MIB_IPADDRROW, *PMIB_IPADDRROW;

Структура MIBJPADDRROW содержит следующие поля:

dwAddr — IP-адрес для данного интерфейса;

dwlndex код данного интерфейса;

ШdwMa.sk — маска подсети для данного IP-адреса;

ШdwBCastAddr адреса рассылки;

ШdwReasmSize — максимальный размер сборки для принимаемых дейтаграмм;

Шunused1 и unused2 не используются.

Спомощью этой функции можно определить, правильны ли параметры локального IP-интерфейса. Чтобы добавить маршрут в таблицу, воспользуйтесь функцией SetlpForwardEntty:

DWORD SetlpForwardEntry ( PMIB_IPFORWARDROW pRoute

);

Ее единственный параметр — pRoute, указатель на структуру MIBJPFORWARDROW. Для добавления маршрута должны быть заданы значения полей dwForwardlflndex, dwForwardDest, dwForwardMask, divForwardNextHop и dwForwardPolicy.

Удаление маршрута

Удаление маршрута — простейшая операция Route. Для этого надо задать только адрес подключавшегося компьютера. Соответствующая этому адресу структура MIBJPFORWARDROWвозвращается функцией GetlpForwardTable

и передается функции DeletelpForwardEntry, удаляющей маршрут:

DWORD DeletelpForwardEntry ( PMIB_IPFORWARDROW pRoute

);

Можно вручную задать необходимые поля параметра pRoutе-. dwForwardlflndex, dwForwardDest, dwFonvardMask, dwForwardNextHop и dwFonvardPolicy.

Утилита ARP

Эта утилита используется для просмотра и редактирования кэша ARP. Пример из Platform SDK, эмулирующий ее работу с помощью вспомогательных

566 Приложение В Вспомогательные функции 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

 

);

 

 

Ее первый параметр — 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;

Структура 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-адреса можно определить с помощью функции GetlpAddrTable. Следующее поле — 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.