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