Konfiguracja TCP/IP hosta. - Pierwsza

Transkrypt

Konfiguracja TCP/IP hosta. - Pierwsza
Rodzina protokołów TCP/IP.
Aplikacja: ipconfig.
dr Zbigniew Lipiński
Instytut Matematyki i Informatyki
ul. Oleska 48
50-204 Opole
[email protected]
Specyfikacja struktury FIXED_INFO
Nazwa struktury: FIXED_INFO
Opis:
Struktura FIXED_INFO zawiera informacje wspólne dla wszystkich kart sieciowych lokalnego hosta.
Struktura FIXED_INFO jest zadeklarowana w pliku IPTypes.h.
Atrybuty:
HostName Nazwa lokalnego hosta.
DomainName Nazwa domeny w której lokalny host jest zarejestrowany.
CurrentDnsServer Atrybut zarezerwowany. Używa atrybutu DnsServerList do uzyskania listy
serwerów DNS lokalnego hosta.
DnsServerList Linkowana lista struktur IP_ADDR_STRING określająca listę serwerów DNS
używanych przez lokalnego hosta.
NodeType Typ węzła lokalnego hosta.
Możliwe wartości atrybutu:
BROADCAST_NODETYPE, PEER_TO_PEER_NODETYPE,
MIXED_NODETYPE, HYBRID_NODETYPE.
ScopeId Nazwa zakresu DHCP (DHCP scope name).
EnableRouting Czy jest udostępniony routing na lokalnym hoście?
EnableProxy Czy lokalny host jest ma funkcje ARP proxy?
EnableDns Czy jest udostępniony DNS na lokalnym hoście?
2
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Implementacja struktury FIXED_INFO
typedef struct {
char
char
PIP_ADDR_STRING
IP_ADDR_STRING
UINT
char
UINT
UINT
UINT
} FIXED_INFO, *PFIXED_INFO;
HostName[MAX_HOSTNAME_LEN + 4];
DomainName[MAX_DOMAIN_NAME_LEN + 4];
CurrentDnsServer;
DnsServerList;
NodeType;
ScopeId[MAX_SCOPE_ID_LEN + 4];
EnableRouting;
EnableProxy;
EnableDns;
3
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Specyfikacja struktury IP_ADAPTER_INFO
Nazwa struktury: IP_ADAPTER_INFO
Opis:
Struktura IP_ADAPTER_INFO zawiera informacje specyficzne dla każdej karty sieciowej lokalnego hosta.
Struktura IP_ADAPTER_INFO jest zadeklarowana w pliku IPTypes.h.
Atrybuty:
Next ComboIndex AdapterName Description AddressLength Address Index Type -
Wskaźnik do następnej karty sieciowej na liście kart.
Atrybut zarezerwowany.
Nazwa karty sieciowej.
Opis karty sieciowej.
Długość adresu sprzętowego (adresu MAC) karty sieciowej.
Adres sprzętowy (adres MAC) karty sieciowej.
Indeks karty sieciowej.
Typ karty sieciowej. Możliwe typy kart:
MIB_IF_TYPE_OTHER, MIB_IF_TYPE_ETHERNET,
MIB_IF_TYPE_TOKEN_RING, MIB_IF_TYPE_FDDI,
MIB_IF_TYPE_PPP, MIB_IF_TYPE_LOOPBACK,
MIB_IF_TYPE_SLIP
Typy kart zdefiniowane są w pliku IPIfCons.h.
DhcpEnabled Czy protokół DHCP jest udostępniony na danej karcie sieciowej.
CurrentIpAddress Atrybut zarezerwowany.
IpAddressList Lista adresów IP przypisanych do danej karty sieciowej.
GatewayList Adres IP domyślnej bramy dla danej karty sieciowej.
DhcpServer Adres IP serwera DHCP danej karty sieciowej.
HaveWins Czy dana karta sieciowa używa usługi WINS (Windows Internet Name Service).
PrimaryWinsServer - Adres IP głównego serwera WINS.
SecondaryWinsServer- Adres IP zapasowego serwera WINS.
LeaseObtained Czas uzyskania dzierżawy adresu IP z serwera DHCP.
LeaseExpires Czas wygaśnięcia dzierżawy adresu IP.
4
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Implementacja struktury IP_ADAPTER_INFO
typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO *
Next;
DWORD
ComboIndex;
char
AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char
Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT
AddressLength;
BYTE
Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD
Index;
UINT
Type;
UINT
DhcpEnabled;
PIP_ADDR_STRING
CurrentIpAddress;
IP_ADDR_STRING
IpAddressList;
IP_ADDR_STRING
GatewayList;
IP_ADDR_STRING
DhcpServer;
BOOL
HaveWins;
IP_ADDR_STRING
PrimaryWinsServer;
IP_ADDR_STRING
SecondaryWinsServer;
time_t
LeaseObtained;
time_t
LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;
5
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Specyfikacja struktury IP_ADDR_STRING
Nazwa struktury: IP_ADDR_STRING
Opis:
Struktura IP_ADDR_STRING określa adres węzła na linkowanej liście adresów IP.
Atrybuty:
Next Wskaźnik do następnej struktury IP_ADDR_STRING na liście.
IpAddress - String jest 16 wymiarową tablicą znaków.Tablica zawiera adres IP.
IpMask - String jest 16 wymiarową tablicą znaków. Tablica zawiera adres IP maski.
Context - Tablica wejść sieciowych NTE (Network Table Entry).
Wartości atrybutu odpowiadają parametrom NTEContext w funkcjach
AddIPAddress() and DeleteIPAddress().
Implementacja struktury IP_ADDR_STRING
typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING*
IP_ADDRESS_STRING
IP_MASK_STRING
DWORD
} IP_ADDR_STRING, *PIP_ADDR_STRING;
Next;
IpAddress;
IpMask;
Context;
6
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Struktury IP_ADDRESS_STRING, IP_MASK_STRING, time_t
Nazwa struktury: IP_ADDRESS_STRING
Opis:
Tablica zawiera adres IP.
Atrybuty: 16 wymiarowa tablica znaków.
Nazwa struktury: IP_MASK_STRING
Opis:
Tablica zawiera adres IP maski.
Atrybuty: 16 wymiarowa tablica znaków.
Nazwa struktury: time_t
Opis:
Sruktura time_t przechowuje czas (w sekundach) od 1 stycznia 1970.
Atrybuty:
7
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Specyfikacja funkcji GetNetworkParams()
Nazwa funkcji
: GetNetworkParams()
Zwracana wartość: DWORD
Funkcja zwraca wartość ERROR_SUCCESS.
Funkcja zwraca następujące kody błędów:
ERROR_BUFFER_OVERFLOW, ERROR_INVALID_PARAMETER,
ERROR_NO_DATA, ERROR_NOT_SUPPORTED.
Argumenty :
PFIXED_INFO pFixedInfo - [out] Wskaźnik do struktury FIXED_INFO przechowującej informacje
parametrach konfiguracji sieciowej lokalnego hosta
PULONG pOutBufLen - [in] Wskaźnik do zmiennej ULONG która określa wielkość struktury
FIXED_INFO. Jeżeli zmienna jest za mała aby zapisać wielkość struktury
funkcja GetNetworkParams() wpisuje wartość wymaganą i zwraca błąd z
kodem ERROR_BUFFER_OVERFLOW.
Opis
: Funkcja GetNetworkParams() służy do uzyskiwania informacji o konfiguracji TCP/IP lokalnego hosta.
8
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Specyfikacja funkcji GetAdaptersInfo()
Nazwa funkcji
: GetAdaptersInfo()
Zwracana wartość: DWORD
Funkcja zwraca wartość ERROR_SUCCESS.
Funkcja zwraca następujące kody błędów:
ERROR_BUFFER_OVERFLOW, ERROR_INVALID_PARAMETER,
ERROR_NO_DATA,ERROR_NOT_SUPPORTED, inne.
Argumenty
:
PIP_ADAPTER_INFO pAdapterInfo - [out] wskaźnik do bufora który przechowuje dane z listy
struktury IP_ADAPTER_INFO.
PULONG pOutBufLen - [in] Wskaźnik do zmiennej ULONG która określa wielkość struktury
FIXED_INFO. Jeżeli zmienna jest za mała aby zapisać wielkość struktury
funkcja GetNetworkParams() wpisuje wartość wymaganą i zwraca błąd z kodem
ERROR_BUFFER_OVERFLOW.
Opis : Funkcja GetAdaptersInfo() służy do uzyskiwania informacji o konfiguracji kart sieciowych na lokalnym hoście.
9
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Specyfikacja funkcji gmtime()
Nazwa funkcji
: gmtime()
Zwracana wartość: TIMER *
Argumenty
: long *
Funkcjonalność
: Funkcja dokonuje konwersji czasu na czas GMT (obecnie zwany czasem UTC,
ang. Coordinated Universal Time).
10
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Ćwiczenie
Przed napisaniem programu ipconfig należy napisać dwa programy:
• przykład użycia funkcji GetNetworkParams().
• przykład użycia funkcji gmtime() i typu struktury tm.
11
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Specyfikacja projektu ipcfg
Pliki nagłówkowe:
windows.h, iphlpapi.h, time.h, iostream.
Zmienne programu:
DWORD Err;
FIXED_INFO
* pFixedInfo;
IP_ADAPTER_INFO * pAdapterInfo;
DWORD AdapterInfoSize;
IP_ADDR_STRING
* pAddrStr;
DWORD FixedInfoSize;
Funkcje programu:
GetNetworkParams(),
GetAdaptersInfo(), gmtime()
Struktury programu:
FIXED_INFO
IP_ADAPTER_INFO
IP_ADDR_STRING
IP_ADDRESS_STRING
IP_MASK_STRING
time_t
12
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Specyfikacja projektu ipcfg
Nazwa projektu: ipcfg
Typ projektu: Win32 console application
Lista plików: ipcfg.cpp
Metoda kompilacji: Microsoft Visual C++ 2008.
Utworzyć projekt typu 'Win32 console application‘ w menu
(-)File-> New -> Project-> Other languages-> Visual C++ -> win32 -> Win32 console
application -> wpisać nazwę: ipcfg -> przycisk (OK) -> Okno Win32 application wizard –
ipcfg-> wybrać: Application settings -> wybrać: Empty project-> Przycisk (Finish).
Konfiguracja projektu:
(-)Project-> nazwa_projektu Properies... -> Configuration Properies-> Linker-> Input ->
Additional Dependecies, wpisać: IPHlpApi.Lib.
Opis programu:
Funkcjonalność: (Run-> cmd) wpisać: \> ipcfg
13
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Struktura programu
1. Sprawdzenie wielkości danych (wartośc parametru FixedInfoSize) i możliwości pobrania informacji o
konfiguracji IP hosta za pomocą struktury FIXED_INFO.
Czy (Err = GetNetworkParams(NULL, &FixedInfoSize)) != 0 ?
2. Alokacja pamięci na dane o konfiguracji IP hosta na podstawie wartości zmiennej FixedInfoSize.
pFixedInfo = (PFIXED_INFO) GlobalAlloc(GPTR, FixedInfoSize);
lub
pFixedInfo = new FIXED_INFO[FixedInfoSize];
pAddrStr = new IP_ADDR_STRING;
po punkcie (4) należy usunąć obiekt poleceniem
delete [] pFixedInfo;
3. Pobranie i sprawdzenie poprawności pobrania danych o konfiguracji hosta.
Czy (Err = GetNetworkParams(pFixedInfo, &FixedInfoSize)) == 0 ?
14
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Struktura programu
4. Przekierowanie na ekran informacji o konfiguracji IP hosta.
(i) Nazwa hosta:
pFixedInfo->HostName;
(ii) Adres IP głównego serwera DNS: pFixedInfo->DnsServerList.IpAddress.String;
(iii) Adresy IP alternatywnych serwerów DNS (użycie wskaźnika pAddrStr):
pAddrStr = pFixedInfo->DnsServerList.Next;
pAddrStr->IpAddress.String;
pAddrStr = pAddrStr->Next;
(iv) Typ adresu hosta:
pFixedInfo->NodeType
Możliwe wartości: 1 – Broadcast, 2 - Peer to peer, 4 – Mixed, 8 – Hybrid
(v) NetBIOS Scope ID:
pFixedInfo->ScopeId;
(vi) IP Routing Enabled:
pFixedInfo->EnableRouting ? "yes" : "no“;
(vii) WINS Proxy Enabled:
pFixedInfo->EnableProxy ? "yes" : "no“;
(viii) NetBIOS Resolution Uses DNS: pFixedInfo->EnableDns ? "yes" : "no“;
15
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Struktura programu
5. Określenie wielkości danych zawierających informacje o kartach sieciowych (struktura IP_ADAPTER_INFO).
Czy (Err = GetAdaptersInfo(NULL, &AdapterInfoSize)) != 0 ?
6. Alokacja pamięci na dane o parametrach karty na podstawie wartości zmiennej AdapterInfoSize.
Czy (pAdapterInfo = (PIP_ADAPTER_INFO) GlobalAlloc(GPTR, AdapterInfoSize)) == NULL ?
lub
pAdapterInfo = new IP_ADAPTER_INFO[AdapterInfoSize];
po ostatnim użyciu owskaźnika pAdapterInfo należy go usunąć poleceniem
delete [] pAdapterInfo;
7. Pobranie i sprawdzenie poprawności pobrania danych o kartach sieciowych.
Czy (Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0 ?
16
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Struktura programu
8. Przekierowanie na ekran informacji o konfiguracji karty sieciowej.
(i) Pobranie informacji o typie karty.
Wartość zmiennej:
pAdapterInfo->Type
MIB_IF_TYPE_ETHERNET: karta typu Ethernet.
MIB_IF_TYPE_TOKENRING: karta typu Token Ring.
MIB_IF_TYPE_FDDI: karta typu FDDI;
MIB_IF_TYPE_PPP:
typ PPP;
MIB_IF_TYPE_LOOPBACK: typ Loopback;
MIB_IF_TYPE_SLIP: typ Slip;
MIB_IF_TYPE_OTHER: inny typ.
(ii) Pobranie informacji o nazwie karty: pAdapterInfo->AdapterName;
(iii) Pobranie opisu karty (nazwa producenta karty): pAdapterInfo->Description
17
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Struktura programu
(iv) Pobranie adresu MAC
Długość adresu MAC, wartość powinna być równa 6 (bajtów): pAdapterInfo->AddressLength;
Poszczególne elementy adresu znajdują się w tablicy adresu MAC: pAdapterInfo->Address[i];
(v) Pobranie informacji o udostępnieniu opcji DHCP.
DHCP Enabled:
pAdapterInfo->DhcpEnabled ? "yes" : "no";
(vi) Pobranie listy adresów IP karty: adres IP, adres maski.
Zmiana wartości wskaźnika: pAddrStr = &(pAdapterInfo->IpAddressList);
Pobranie listy adresów IP:
Adres IP:
pAddrStr->IpAddress.String;
Adres maski: pAddrStr->IpMask.String;
pAddrStr = pAddrStr->Next;
(vii) Pobranie adresów IP domyślnych bram.
Pierwsza domyślna brama: pAdapterInfo>GatewayList.IpAddress.String.
pAddrStr = pAdapterInfo->GatewayList.Next;
Pobranie adresów IP następnych domyślnych bram:
pAddrStr->IpAddress.String;
pAddrStr = pAddrStr->Next;
18
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
Struktura programu
(viii) Pobranie adresu IP serwera DHCP.
DHCP Server:
pAdapterInfo->DhcpServer.IpAddress.String.
(ix) Pobranie adresów IP serwerów WINS.
Primary WINS Server: pAdapterInfo->PrimaryWinsServer.IpAddress.String;
Secondary WINS Server: pAdapterInfo->SecondaryWinsServer.IpAddress.String;
(x) Pobranie czasu dzierżawy i terminu ważności adresu IP z serwera DHCP
Konwersja czasu na wyrażonej w sekundach na czas w postaci hh:mm:ss
struct tm *newtime;
newtime = gmtime(&pAdapterInfo->LeaseObtained);
Czas uzyskania dzierżawy: asctime( newtime );
newtime = gmtime(&pAdapterInfo->LeaseExpires);
Czas wygaśnięcia dzierżawy: asctime( newtime );
(xi) Pobranie informacji o następnej karcie sieciowej:
pAdapterInfo = pAdapterInfo->Next;
19
Z. Lipiński, Instytut Matematyki i Informatyki, Uniwersytet Opolski, Podstawy programowania sieciowego
#include <windows.h>
#include <time.h>
#include <iphlpapi.h>
#include <iostream>
using namespace std;
int main()
{
DWORD
PFIXED_INFO
DWORD
IP_ADAPTER_INFO
DWORD
IP_ADDR_STRING
Err;
pFixedInfo;
FixedInfoSize = NULL;
* pAdapterInfo, * pAdapt;
AdapterInfoSize = 0;
* pAddrStr = NULL;
GetNetworkParams(NULL, &FixedInfoSize);
pFixedInfo
pAddrStr
= new FIXED_INFO[FixedInfoSize];
= new IP_ADDR_STRING;
GetNetworkParams(pFixedInfo, &FixedInfoSize);
cout << "Host Name . . . . . . . . . : " << pFixedInfo -> HostName << endl;
cout << "Domain Name . . . . . . . . : " << pFixedInfo -> DomainName << endl;
cout << "Preffered DNS Server . . . . : " << pFixedInfo -> DnsServerList.IpAddress.String
<< endl;
cout << "Alternative DNS Servers: "<< endl;
pAddrStr = pFixedInfo -> DnsServerList.Next;
while ( pAddrStr )
{
cout << "\t\t\t"<< pAddrStr ->IpAddress.String << endl;
pAddrStr = pAddrStr ->Next;
}
delete pAddrStr;
20
cout << "Typ wezla
. . . . . . . . . : ";
switch (pFixedInfo->NodeType)
{
case 1: cout << "Broadcast" << endl;
break;
case 2:
cout << "Peer to peer" << endl;
break;
case 4: cout << "Mixed" << endl;
break;
case 8: cout << "Hybrid" << endl;
break;
default: cout << "\n" << endl;
break;
}
cout
cout
cout
cout
<<"NetBIOS ScopeID .
<<"IP Routing Enabled
<<"WINS Proxy Enabled
<<"NetBIOS Resolution
. . . . . :
. . . . . :
. . . . . :
Uses DNS .:
"
"
"
"
<<
<<
<<
<<
pFixedInfo->ScopeId << endl;
(pFixedInfo->EnableRouting ? "yes" : "no") << endl;
(pFixedInfo->EnableProxy ? "yes" : "no") << endl;
(pFixedInfo->EnableDns ? "yes" : "no") << endl;
delete [] pFixedInfo;
GetAdaptersInfo(NULL, &AdapterInfoSize);
pAdapterInfo = new IP_ADAPTER_INFO[AdapterInfoSize];
if ((Err = GetAdaptersInfo(pAdapterInfo, &AdapterInfoSize)) != 0)
{
cout << "GetAdaptersInfo() error no: "<< Err << endl;
return 0;
}
21
pAdapt = pAdapterInfo;
while (pAdapt)
{
cout << "Karta typu . . . . . . . . . : ";
switch (pAdapt->Type)
{
case MIB_IF_TYPE_ETHERNET:
cout << "Ethernet"<< endl;
break;
case MIB_IF_TYPE_TOKENRING:
cout << "Token Ring"<< endl;
break;
case MIB_IF_TYPE_FDDI:
cout << "FDDI"<< endl;
break;
case MIB_IF_TYPE_PPP:
cout << "PPP"<< endl;
break;
case MIB_IF_TYPE_LOOPBACK:
cout << "Loopback"<< endl;
break;
case MIB_IF_TYPE_SLIP:
cout << "Slip"<< endl;
break;
case MIB_IF_TYPE_OTHER: cout << "Nieznany"<< endl;
break;
default:
cout << "Nieznany"<< endl;
break;
}
cout << "Nazwa karty . . . . . . . . : " << pAdapt->AdapterName << endl;
cout << "Opis . . . . . . . . : " << pAdapt->Description << endl;
cout << "Adresy MAC . . . . . : " ;
22
for (unsigned int i=0; i< pAdapt->AddressLength; i++)
{
if (i == (pAdapt->AddressLength - 1))
printf("%.2X\n",(int)pAdapt->Address[i]);
else
printf("%.2X-",(int)pAdapt->Address[i]);
}
cout << "DHCP Enabled . . . . : " << (pAdapt->DhcpEnabled ? "yes" : "no") << endl;
pAddrStr = &(pAdapt->IpAddressList);
while(pAddrStr)
{
cout << "Adres IP . . . . . . : " << pAddrStr->IpAddress.String << endl;
cout << "Subnet Mask . . . . : " << pAddrStr->IpMask.String << endl;
pAddrStr = pAddrStr->Next;
}
cout << "Default Gateway . . : " << pAdapt->GatewayList.IpAddress.String << endl;
pAddrStr = pAdapt->GatewayList.Next;
while(pAddrStr)
{
cout << pAddrStr->IpAddress.String << endl;
pAddrStr = pAddrStr->Next;
}
23
cout
cout
cout
cout
<<
<<
<<
<<
"DHCP Server. . . . . :
"Primary WINS Server :
"Secondary WINS Server:
"Dhcp Enabled:
"
"
"
"
<<
<<
<<
<<
pAdapt->DhcpServer.IpAddress.String << endl;
pAdapt->PrimaryWinsServer.IpAddress.String << endl;
pAdapt->SecondaryWinsServer.IpAddress.String << endl;
pAdapt->DhcpEnabled << endl;
if (pAdapt->DhcpEnabled != 0)
{
struct tm newtime;
char buf[26];
errno_t err;
err = _gmtime64_s( &newtime, &pAdapt->LeaseObtained );
err = asctime_s(buf, 26, &newtime);
//asctime( newtime ) ;
cout << "Lease Obtained . . . : " << buf << endl;
err = _gmtime64_s( &newtime, &pAdapt->LeaseExpires);
err = asctime_s(buf, 26, &newtime);
cout << "Lease Expires . . . : " << buf << endl;
} // end if
pAdapt = pAdapt->Next;
} // end while (pAdapterInfo)
delete [] pAdapterInfo;
return 0;
} // end main
24

Podobne dokumenty