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

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

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

548

Приложение А Перечень команд NetBIOS

КомандаNCBSSTAT

Команда получает сведения о состоянии сеанса. При вызове этой команды ncb_buffer ссылается на область памяти, которая будет заполнена структурой SESSION'_ HEADER, далее следуют одна или более структур SESSION_BUFFER. Если первый байт ncbjname — звездочка ('), команда выясняет состояние для всех сеансов, связанных со всеми именами в таблице локальных имен. Если предоставленный буфер слишком мал, выдается ошибка NRCJNCOMP (0x06). Если длина буфера меньше 4 байт — ошибка NRCJBUFLEN (0x01).

Поле

Ввод или вывод

Нужно ли задать

 

ncbjzommand

Ввод

Да

 

neb

retcode

Вывод

Нет

 

ncbjsn

Не обязательно

Нет

к

neb

пит

Вывод

Нет _„

к

neb

buffer

Ввод

Да

 

nebjength

Ввод

Да

 

neb

callname

Не обязательно

Нет

 

ncbjname

Ввод

Да

 

neb

rto

Не обязательно

Нет

,

nebjsto

Не обязательно

Нет

 

nebjdost

Ввод

Нет

 

nebjana пит

Ввод

Да

 

ncb_cmdjcplt

Вывод

Нет

 

neb

event

Ввод

Нет

 

 

 

 

 

 

КомандаNCBUNLINK

Команда отменяет привязку к адаптеру. Предусмотрена для совместимости с ранними версиями NetBIOS и на платформах Win32 не оказывает эффекта.

П Р И Л О Ж Е Н И Е

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

i

В этом приложении мы опишем некоторые новые API-функции для получения информации и настройки параметров протокола IP. Эти функции позволяют программно использовать возможности следующих стандартных IP-

уТИЛИТ:

Ipconfig.exe (или Winipcfg.exe в Microsoft Windows 95) — выводит информацию о конфигурации IP и позволяет освобождать и обновлять IPадреса, выделенные DHCP;

Netstat.exe — выводит таблицу TCP-соединений, таблицу прослушиваемых портов UDP и статистику протокола IP;

Route.exe — выводит и редактирует таблицы маршрутизации;

ШАгр.ехе — выводит и редактирует используемые протоколом разрешения адресов (address resolution protocol, ARP) таблицы трансляции IP-ад- ресов в физические.

Функции, описанные в этом приложении, доступны в основном в Windows 98 и Windows 2000, некоторые — и в Windows NT 4 с Service Pack 4 (или более поздним), но ни одна не доступна в Windows 95. При обсуждении каждой функции будет указываться соответствующая платформа. Прототипы для всех функций, описанных в приложении, определены в файле Iphlpapi.h. При компоновке приложения необходимо подключать библиотеку Iphlpapi.lib.

ВозможностиутилитыIpconfig

Утилита Ipconfig поставляет два блока информации: о конфигурации IP и о параметрах IP для каждого сетевого адаптера, установленного на данном компьютере. Чтобы получить информацию о конфигурации IP, воспользуйтесь функцией GetNetworkParams:

DWORD GetNetworkParams( PFIXED_INFO pFixedlnfo, PULONG pOutBufLen

);

Параметр pFixedlnfo — указатель на буфер, куда будет помещена структура FIXED JNFO с информацией о конфигурации IP. Параметр pOutBufLen — указатель на переменную, задающую размер буфера, который передается через первый параметр. Если этого размера окажется не достаточно, функция

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

GetNetworkParams вернет значение ERROR_BUFFER OVERFLOW и определит значение параметра pOutBuJLen, равным необходимому размеру буфера.

Структура FIXED JNFO имеет следующий вид:

s

typedef struct

 

 

{

 

 

 

 

 

char

 

HostName[MAX_HOSTNAHE_LEN + 4] ;

 

 

char

t

DomainName[MAX_DOMAIN_NAME_LEN + 4 ] ;

 

 

PIP_ADDR_STRING CurrentDnsServer;

 

 

IP_ADDR_STRING DnsServerList;

 

 

UINT

 

NodeType;

 

 

char

 

ScopeId[MAX_SCOPE_ID_LEN + 4];

 

 

UINT

 

EnableRouting;

 

 

UINT

 

EnableProxy;

 

 

UINT

 

EnableDns;

 

} FIXEO_INFO,

*PFIXED_INFO;

 

 

Она содержит следующие поля.

 

HostName — имя данного компьютера, определенное системой DNS.

 

Ш DomainName — домен DNS, к которому относится компьютер.

#

Ш

CurrentDnsServei— IP-адрес текущего DNS-сервера.

 

DnsServerList

— связанный список, содержащий используемые данным

 

компьютером DNS-серверы.

 

IINodeType — способ, которым система распознает имена NetBIOS в сети

сIP. Вот список его возможных значений:

Ш BROADCASTNODETYPE — разрешение имен NetBIOS типа Ь-узел; система использует IP-широковещание для регистрации и разрешения имен NetBIOS;

И PEER_TO_PEER_NODETYPE разрешение имен NetBIOS типа р-узел; система использует соединение «точка-точка» с сервером имен NetBIOS (например, WINS) для регистрации и разрешения имен компьютеров в IP-адреса;

К MIXEDNODETYPE — разрешение имен NetBIOS типа m-узел (mixed node, узел смешанного типа), при котором система использует оба описанных выше способа: сначала метод b-узла, если он не срабатывает, то метод р-узла;

HYBRIDNODETYPE разрешение имен NetBIOS типа h-узел (hybrid node, гибридный узел); система также использует оба способа, но сначала — метод р-узла, а если он не срабатывает, то метод Ь-узла.

Scopeld задает строку, добавляемую к имени NetBIOS для логического объединения двух и более компьютеров. Это необходимо для соединения NetBIOS по протоколу TCP/IP.

Я EnableRouting — указывает, будет ли данная система осуществлять маршрутизацию IP-пакетов между сетями, к которым подключена.

Ш EnableProxy — указывает, будет ли система работать в сети как проксиагент системы WINS. Этот агент отвечает на широковещательные запро-

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

551

Я сы по именам, распознанными WINS, и позволяет сетям из компьютеров b-узлов соединяться с серверами в других подсетях, зарегистрированных

в WINS.

EnableDns — указывает, будет ли NetBIOS обращаться к DNS с именами, которые не разрешаются с помощью WINS, рассылки или файла LMHOSTS

Поле DnsServerList структуры FIXED JNFO — это структура IP_ADDR STRING,

представляющая начало связанного списка IP-адресов:

typedef struct _IP_ADDR_STRING

 

 

ВПК

 

 

 

 

struct _IP_ADDR_STRING« Next;

 

 

*

IP_ADDRESS_STRING

IpAddress;

 

i, Q^

E

IP_MASK_STRING

IpMask;

 

 

 

DWORD

Context;

4*'

^\_41 '

}

IP_ADDR_STRING, *PIP_ADDR_STRING;

fry,

яу,

Поле Next содержит IP-адрес следующего в этом списке DNS-сервера. Если значение поля — NULL, то это означает конец списка. Поле IpAddress — строка символов, в которой IP-адрес представлен в десятично-точечной нотации Поле IpMask — строка символов, в которой содержится маска подсети, соответствующая IP-адресу в поле IpAddress. Последнее поле — Context, связывает данный IP-адрес с уникальным для данной системы кодом.

Утилита Ipconfig.exe также получает информацию о конфигурации IP для конкретного сетевого оборудования. Это может быть адаптер Ethernet или даже адаптер удаленного доступа RAS. Информацию об адаптере дает функция GetAdaptersInfo:

DWORD GetAdaptersInfo (

цщ,

%

PIP_ADAPTER_INFO pAdapterlnfo,

.„'

PULONG pOutBufLen

' *"'

Л

Параметр pAdapterlnfo — указатель на заранее размещенный в приложении буфер, в который будет помещена структура ADAPTER JNFO с информацией о конфигурации адаптера Параметр pOutBufLen должен содержать указатель на переменную, задающую размер этого буфера. Если размер не достаточен, функция GetAdaptersInfo вернет значение ERRORBUFFERJDVERFLOW

и передаст в параметре pOutBufLen требуемый размер буфера.

Структура IP ADAPTER JNFO — это, фактически, список структур, содержащих информацию о настройках IP для каждого доступного на данном компьютере сетевого адаптера:

typedef struct _IP_ADAPTER_INFO

struct _IP_ADAPTER_INFO* Next;

DWORD

Combolndex;

char

AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];

char

Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];

UINT

AddressLength;

BYTE

Address[MAX_ADAPTER_ADDRESS_LENGTH];

552

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

DWORD

Index;

UINT

Type;

UINT

DhcpEnabled;

PIP_ADDR_STRING CurrentlpAddress;

IP_ADDR_STRING IpAddressList;

IP_ADDR_STRING GatewayList;

IP_ADDR_STRING DhcpServer;

BOOL

HaveWins;

IP_ADDR_STRING PrimaryWinsServer;

IP_ADDR_STRING SecondaryWinsServer;

timejt

LeaseObtained;

time_t

LeaseExpires;

} IP_ADAPTER_INFO,

*PIP_ADAPTER_INFO;

,

;xfc

гм t

ЮА.'

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

Next — следующий адаптер в буфере. Значение NULL означает коне^ списка.

ШCombolndex не используется и задается равным 0.

AdapterName — название адаптера.

>

Description — краткое описание адаптера.

Ш AddressLength — размер физического адреса адаптера в байтах.

 

Ж Address физический адрес адаптера.

 

Index — уникальный код сетевого интерфейса, присвоенный данному

 

адаптеру.

 

Туре — число, соответствующее типу адаптера:

'

 

MIBIFTYPEETHERNET адаптер Ethernet;

3

 

MIBJF TYPEFDDI - адаптер FDDI;

 

 

Ш MIB IFTYPELOOPBACK адаптер-петля;

(

MIBJF TYPE6THER иной тип адаптера;

MIBJF TYPE_PPP - адаптер РРР;

MIBJF TYPEJSIIP адаптер SLIP;

ИMIBJFJYPEJTOKENRING адаптер Token Ring.

ШDhcpEnabled — показывает, задействована ли служба DHCP для этого адаптера.

ШCurrentlpAddress не используется и равен NULL.

ШIpAddressList список назначенных данному адаптеру IP-адресов.

GatewayList — список IP-адресов шлюза по умолчанию.

DhcpServer — список из одного пункта, содержащий IP-адрес используемого DHCP-сервера.

HaveWins показывает, использует ли этот адаптер WINS-сервер.

PrimaryWinsServer список из одного пункта, содержащий IP-адрес используемого основного WINS-сервера.

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

553

Я SecondatyWitisServer список из одного пункта, содержащий IP-адрес используемого дополнительного WINS-сервера.

В LeaseObtained время получения аренды IP-адреса, выделенного DHCPсервером.

ШLeaseExpires дата окончания срока аренды IP-адреса.

Освобождение и обновление IP-адресов

Утилита Ipconfig.exe может освобождать и обновлять IP-адреса с помощьк • параметров командной строки: /release и /renew. Для программного осво бождения IP-адреса служит функция IPReleaseAddress:

DWORD IpReleaseAddress (

PIP_ADAPTER_INDEX_MAP Adapterlnfo

Для программного обновления IP-адреса применяется функция IPRenew Address:

DWORD IpRenewAddress (

PIP_ADAPTER_INDEX_MAP Adapterlnfo

Единственный параметр этих функций — Adapterlnfo, структура IP ADAPTER JNDEX_MAP, идентифицирующая адаптер, для которого надо освободить

или обновить адрес

„^ . v.,

„ , » aj

typedef struct _IP_ADAPTER_INDEX_MAP

)

ULONG Index;

 

 

WCHAR Name[MAX_ADAPTER_NAME];

 

}IP_ADAPTER_INDEX_MAP,

*PIP_ADAPTER_INDEX_MAP;

 

Структура IP ADAPTER JNDEX MAP содержит следующие поля.

Ж Index внутренний код сетевого интерфейса, присвоенный данному адаптеру;

К Name — название адаптера.

Структура IP_ADAPTER_INDEX_MAP для конкретного адаптера может быть получена с помощью функции Getlnterfacelnfo:

DWORD Getlnterfacelnfo (

IN PIP_INTERFACE_INFO plfTable,

OUT PULONG dwOutBufLen

Параметр plfTable — это указатель на буфер IPJNTERFACEJNFO, выделенный в приложении для информации об интерфейсе. Параметр dwOutBufLen — указатель на переменную, задающую размер этого буфера Если размер недостаточен, функция Getlnterfacelnfo вернет значение ERRORJNSUFFICIENTBUFFER

и передаст в параметре dwOutBufLen требуемый размер буфера.

554

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

Структура IPJNTERFACEJNFO определена

так:

typedef struct _IP_INTERFACE_INFO

 

{

 

ЧМ*

LONG

NumAdapters;

.

IP_ADAPTER_INDEX_MAP Adapter[1];

ю ,

} IP_INTERFACE_INFO,*PIP_INTERFACE_INFO;

 

Она содержит следующие поля:

ШNumAdapters — количество адаптеров в поле Adapter,

ШAdapter массив структур IP_ADAPTER_INDEX_MAP.

Получив структуру IP_ADAPTER_INDEX_MAP для конкретного адаптера, далее можно освободить или обновить выделенный DHCP-сервером IP-ад- рес с помощью функций IPReleaseAddress и IPRenewAddress.

Изменение IP-адреса

Утилита Ipconfig.exe не позволяет изменить IP-адрес для сетевого адаптера (кроме случая, когда используется служба DHCP). Однако имеются две вспомогательные IP-функции -— AddlpAddress и DeletelpAddress, позволяющие добавлять и удалять IP-адреса для адаптера. Применение этих функций требует знания внутренних кодов адаптеров и контекстных кодов IP-адресов. В Windows каждый сетевой адаптер имеет уникальный числовой код (ID), a каждый IP-адрес — уникальный контекстный код. Эти коды можно выяснить, вызвав функцию GetAdapterslnfo. Функция AddlpAddress определена так:

DWORD AddlPAddress (

IPAddr Address,

IPMask IpMask,

DWORD Iflndex,

PULONG NTEContext,

PULONG NTEInstance

Параметр Address — это IP-адрес, добавляемый в виде длинного целого без знака. IpMask — маска подсети того же типа. Iflndex — порядковый номер адаптера, для которого добавляется адрес. Параметр NTEContext получает контекстный код, соответствующий добавляемому адресу, а параметр NTEInstance — соответствующий этому адресу код экземпляра.

Для программного удаления IP-адреса служит функция DeletelpAddress:

DW3RD DeletelPAddress (

ULONG NTEContext

);

Параметр NTEContext — это контекстный код, соответствующий удаляемому IP-адресу (его можно получить, вызвав функцию GetAdapterslnfo).

ВозможностиутилитыNetstat

Э"'а утилита выводит информацию о таблице TCP-соединений, таблицу прост ушиваемых портов UDP, а также статистику протокола IP для данного ком-

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

555

пьютера. Функции для получения этой информации работают не только в Windows 98 и Windows 2000, но также в Windows NT 4 с Service Pack 4 и последующих версиях.

Получение таблицы ТСР-соединений

Эта информация выводится на экран при запуске утилиты Netstat.exe с параметрами -р tcp -а. Чтобы получить эти данные программно, воспользуйтесь функцией GetTcpTable-.

DWORD GetTcpTable(

PMIBJXPTABLE pTcpTable,

PDWORD pdwSize,

BOOL bOrder

Параметр pTcpTable — указатель на буфер MIBTCPTABLE, в который будет помещена информация о TCP-соединениях. Параметр pdwSize — указатель на переменную, задающую размер этого буфера. Если размера буфера не достаточно, функция передаст в этом параметре требуемый размер. Параметр bOrder указывает, нужно ли сортировать информацию.

Возвращаемая структура MIBJTCPTABLE имеет вид:

typedef struct MIB_TCPTABLE

! H <

 

DWORD dwNumEntries;

 

 

MIB_TCPROW table[ANY_SIZE];

 

 

} MIB_TCPTABLE, *PMIB_TCPTABLE;

 

 

Она содержит следующие поля:

 

' Ь ч

Ж dwNumEntries — количество строк в поле table;

Mi

 

Ш table — указатель на массив структур типа MIBTCPROW, содержащих информацию о ТСР-соединениях.

Структура MIBJTCPROW содержит информацию о парах IP-адресов, образующих ТСР-соединение:

typedef struct _MIB_TCPROW

<

DWORD dwState; DWORD dwLocalAddr; DWORD dwLocalPort; DWORD dwRemoteAddr;

DWORDdwRemotePort;

} MIB_TCPROW, •PMIBJXPROW;

Эта структура содержит следующие поля.

Ш dwState состояние данного TCP-соединения. Может принимать значения:

MIBTCP STATE CLOSED CLOSED;

ШMIBTCP STATE CLOSING - CLOSING;

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

MIB TCP STATE CLOSE WAIT CLOSE WAIT; ш Ш MIBTCP STATE DELETE TCB DELETE; ™"

ШMIB TCP STATE ESTAB ESTABLISHED;

ШMIB TCP STATE FIN WAIT 1 FIN WAITl;f

Ш MIB TCP STATEFINWAIT2 - FIN WAIT2;

^ ;<

Ж MIB TCP STATE LAST ACK — LAST ACK;

 

Ш MIB TCP STATE LISTEN — LISTENING;

 

MIB TCP STATE SYNRCVD SYN RCVD;

 

MIB TCP STATE SYNSENT- SYN SENT;

 

MIBTCPSTATE TIME WAIT - TIME WAIT;

 

Ш dwLocalAddr локальный IP-адрес данного соединения. II dwLocalPort — локальный порт данного соединения.

Ш. dwRemoteAddr внешний IP-адрес данного соединения.

dwRemotePort внешний порт данного соединения.

ПолучениетаблицыпрослушиваемыхпортовUDP

l

!

Эта информация выводится на экран при запуске утилиты Netstat.exe с па>- раметрами -р udp -а. Чтобы получить эти данные, программно, воспользуй^- тесь функцией GetUdpTable-.

DWORD GetUdpTable(

PMIBJJDPTABLE pUdpTable,

PDWORD pdwSize,

BOOL border

);

X l "

Параметр pUdpTable — указатель на буфер MIBJJDPTABLE, в который будет помещена информация о прослушиваемых портах UDP. Параметр pdwSize — указатель на переменную, задающую размер этого буфера. Если размера буфера не достаточно, функция передаст в этом параметре требуемый размер. Параметр bOrder указывает, будет ли информация отсортирована.

Возвращаемая структура MIBJJDPTABLE имеет вид-

typedef struct _MIB_UDPTABLE

{

DWORDdwNumEntrles; MIBJJDPROW tabletANY_SIZE];

} MIB UDPTABLE, * PMIBJJDPTABLE;

4* {

Она содержит следующие поля:

ШdwNumEntries — количество строк в поле table;

Шtable — указатель на массив структур типа MIBJJDPROW, содержащих информацию о прослушиваемых портах UDP.

Структура MIBJJDPROW содержит IP-адрес, через который UDP ожидает приема дейтаграмм-

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

557

typedef struct _MIB_UDPROW

{

DWORD dwLocalAddr;

DWORDdwLocalPort;

} MIBJJDPROW, * PMIB_UDPROW; i H i ^ j r *щ*

Она содержит следующие поля:

dwLocalAddr локальный IP-адрес.

dwLocalPort — локальный IP-порт.

Получениестатистикио протоколе IP

Статистическую информацию выводит утилита Netstat.exe с параметром -s. Ее можно получить также программно с помощью функций GetlpStatistics, GetlcmpStatistics, GetTcpStatistics и GetUdpStatistics. Функция GetlpStatistics по-

лучает статистику IP для данного компьютера:

 

s»« ..

• «.I

DWORDGetIpStatistics(

 

PMIB_IPSTATSpStats

 

) ;

 

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

typedef struct _MIB_IPSTATS

{

- v

DWORD

dwForwarding;

DWORD

dwDefaultTTL;

DWORD

dwInReceives;

DWORD

dwInHdrErrors;

DWORD

dwInAddrErrors;

DWORD

dwForwDatagrams;

DWORD

dwInUnknownProtos;

DWORD

dwInDiscards;

DWORD

dwInDelivers;

DWORD

dwOutRequests;

DWORD

dwRoutingDiscards;

DWORD

dwOutDiscards;

DWORD

dwOutNoRoutes;

DWORD

dwReasmTimeout;

DWORD

dwReasmReqds;

DWORD

dwReasmOks;

DWORD

dwReasmFails;

DWORD

dwFragOks;

DWORD

dwFragFails;

DWORD

dwFragCreates;

DWORD

dwNumlf;

DWORD

dwNumAddr;

DWORD

dwNumRoutes;

} HIB_IPSTATS, *PMIB_IPSTATS;