Protokół ARP. dr Zbigniew Lipiński. Instytut Matematyki i Informatyki ul. Oleska 48 50-204 Opole zlipinski@math.uni.opole.pl



Podobne dokumenty
Rodzina protokołów TCP/IP. Aplikacja: ipconfig.

Statystyka protokołów i połączeń sieciowych.

Sieci Komputerowe. Protokół ARP Address Resolution Protocol. Protokół RARP Reverse Address Resolution Protocol

Aplikacja Sieciowa. Najpierw tworzymy nowy projekt, tym razem pracować będziemy w konsoli, a zatem: File->New- >Project

Wykład 15. Literatura. Kompilatory. Elementarne różnice. Preprocesor. Słowa kluczowe

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

ARP Address Resolution Protocol (RFC 826)

Protokół DNS. Aplikacja dnsquery

DR INŻ. ROBERT WÓJCIK DR INŻ. JERZY DOMŻAŁ

Pobieranie argumentów wiersza polecenia

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

Sun RPC/XDR 10. listopada Dariusz Wawrzyniak (IIPP) 1

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Internet Control Message Protocol Aplikacja ping

Sun RPC/XDR. Dariusz Wawrzyniak 1

external Data Representation

I - Microsoft Visual Studio C++

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Język ludzki kod maszynowy

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Internet Control Message Protocol (ICMP) Łukasz Trzciałkowski

Tunelowanie, kapsułkowanie, XDR. 1. Transmisja tunelowa i kapsułkowanie serwery proxy. 2. Zewnętrzna reprezentacja danych XDR.

Projektowanie klas c.d. Projektowanie klas przykład

ZiMSK dr inż. Łukasz Sturgulewski, DHCP

external Data Representation

Wykład VII. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Oprogramowanie komunikacyjne dla Internetu rzeczy Laboratorium nr 4 komunikacja unicastowa IPv6

Sieciowa komunikacja procesów - XDR i RPC

4 bity zarezerwowane dla przyszłych zastosowań 11 bitów określających źródło błędu 16 bitów określających rodzaj błędu.

Interfejs programowy Windows Sockets 2. Aplikacja klient-serwer TCP Echo

Część 4 życie programu

Microsoft IT Academy kurs programowania

Zdalne wywoływanie procedur RPC. Dariusz Wawrzyniak 1

Programowanie Proceduralne

Zdalne wywoływanie procedur RPC 27. października Dariusz Wawrzyniak (IIPP) 1

Zdalne wywoływanie procedur RPC 27. października 2010

Adresowanie grupowe. Bartłomiej Świercz. Katedra Mikroelektroniki i Technik Informatycznych. Łódź, 25 kwietnia 2006

Zdalne wywoływanie procedur RPC

Zdalne wywoływanie procedur RPC

#line #endif #ifndef #pragma

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy programowania skrót z wykładów:

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

Wstęp do programowania obiektowego. WYKŁAD 3 Dziedziczenie Pola i funkcje statyczne Funkcje zaprzyjaźnione, this

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

Programowanie Sieciowe 1

Warstwa sieciowa rutowanie

Sieci komputerowe - Wstęp do intersieci, protokół IPv4

Aplikacja Sieciowa wątki po stronie klienta

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

TRX API opis funkcji interfejsu

Instrukcja 6 - ARP i DNS - translacja adresów

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

Programowanie 2. Język C++. Wykład 1.

Podstawy Transmisji Danych. Wykład IV. Protokół IPV4. Sieci WAN to połączenia pomiędzy sieciami LAN

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Podstawowe elementy proceduralne w C++ Program i wyjście. Zmienne i arytmetyka. Wskaźniki i tablice. Testy i pętle. Funkcje.

DYNAMICZNE PRZYDZIELANIE PAMIECI

Laboratorium - Wykorzystanie programu Wireskark do badania ramek Ethernetowych

Operatory cd. Relacyjne: ==!= < > <= >= bool b; int i =10, j =20; dzielenie całkowitych wynik jest całkowity! Łączenie tekstu: + string s = "Ala ma ";

Gniazda surowe. Bartłomiej Świercz. Łódź,9maja2006. Katedra Mikroelektroniki i Technik Informatycznych. Bartłomiej Świercz Gniazda surowe

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 26 marca kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 40

Programowanie. Ćwiczenie Język C. Środowisko programowania Visual Studio

Podstawowe części projektu w Javie

Programowanie obiektowe

Sieci komputerowe - adresacja internetowa

Ćwiczenie 7 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Modelowanie numeryczne w fizyce atmosfery Ćwiczenia 3

Sieci Komputerowe. Protokół ICMP - Internet Control Message Protocol Protokół ICMP version 6. dr Zbigniew Lipiński

DR INŻ. ROBERT WÓJCIK DR INŻ. JERZY DOMŻAŁ ADRESACJA W SIECIACH IP. WSTĘP DO SIECI INTERNET Kraków, dn. 24 października 2016r.

1. Tworzenie nowego projektu.

Laboratorium - Przechwytywanie i badanie datagramów DNS w programie Wireshark

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Tworzenie aplikacji w języku Java

Sieci Komputerowe. Wykład 1: TCP/IP i adresowanie w sieci Internet

Podstawy programowania. Wykład Co jeszcze... Przypomnienia, uzupełnienia. Krzysztof Banaś Podstawy programowania 1

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

Java Podstawy. Michał Bereta

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Języki programowania - podstawy

Komunikacja w sieciach komputerowych

Kompilator języka C na procesor 8051 RC51 implementacja

Wykład. Materiały bazują częściowo na slajdach Marata Dukhana

Programowanie komputerowe. Zajęcia 4

Dla każdej operacji łącznie tworzenia danych i zapisu ich do pliku przeprowadzić pomiar czasu wykonania polecenia. Wyniki przedstawić w tabelce.

MODEL WARSTWOWY PROTOKOŁY TCP/IP

Warstwa sieciowa. Model OSI Model TCP/IP. Aplikacji. Aplikacji. Prezentacji. Sesji. Transportowa. Transportowa

Skąd dostać adres? Metody uzyskiwania adresów IP. Statycznie RARP. Część sieciowa. Część hosta

Biblioteka standardowa - operacje wejścia/wyjścia

Co nie powinno być umieszczane w plikach nagłówkowych:

Wskaźniki. Informatyka

ALGORYTMY I STRUKTURY DANYCH

Plan wykładu. Warstwa sieci. Po co adresacja w warstwie sieci? Warstwa sieci

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Transkrypt:

Protokół ARP Aplikacja printarp dr Zbigniew Lipiński Instytut Matematyki i Informatyki ul. Oleska 48 50-204 Opole zlipinski@math.uni.opole.pl

Address Resolution Protocol ARP, (ang.) Address Resolution Protocol. RFC 826. Protokół ARP jest protokołem warstwy Sieci modelu referencyjnego OSI. Protokół ARP należy do rodziny protokołów TCP/IP. Protokół ARP służy do znajdowania adresów fizycznych kart sieciowych (adresów MAC) na podstawie adresów IP. Protokół ARP służy do: wysyłania zapytań do sieci o adres MAC, uaktualniania tablic arp. 2

Struktura nagłówka komunikatu ARP 4 8 12 1 Typ adresu nadawcy Typ adresu odbiorcy 1 2 3 4 5 Dl. adresu MAC Ostanie 16 bitow adresu MAC nadawcy 16 Bity Dl. adresu protokolu Ostatnie16 bitow adresu protokolu nadawcy 20 Pierwsze 32 bity adresu MAC nadawcy Ostatnie 32 bity adresu MAC odbiorcy 6 Ostatnie32 bity adresu protokolu odbiorcy Struktura komunikatu ARP 24 Operacja 28 32 Pierwsze 16 bitow adresu protokolu nadawcy Pierwsze 16 bitow adresu MAC odbiorcy 3

Struktura nagłówka komunikatu ARP Pole: Pole: Pole: Pole: Pole: Pole: Pole: Pole: Pole: Typ adresu fizycznego, (Hardware Type). Wielkość: 16 bitów. Pole określa typ adresu MAC (typ karty sieciowej). Typy adresów. Wartość: 1 (Ethernet), 2 (Experimental Ethernet), 3 (X.25), 4 (Proteon ProNET - Token Ring), 5 (Chaos), 6 (IEEE 802.X), 7 (ARCnet). Typ adresu protokołu, (Protocol Type). Wielkość: 16 bitów. Pole określa typ protokołu jakiego użył host wysyłający zapytanie. Dla rodziny TCP/IP użyty protokół jest typu 'Ethernet'. Dł. adresu MAC, (Hardware Address Length). Wielkość: 8 bitów. Długość (wyrażona w bajtach) adresu fizycznego w datagramie. Dla adresu MAC wartość = 6 bajtów. Dł. adresu protokołu, (Protocol Address Length). Wielkość: 8 bitów. Długość (wyrażona w bajtach) adresu protokołu. Dla adresu IP wartość pola = 4 bajty. Operacja, (Operation Code, Opcode). Wielkość: 16 bitów. Wartość kodu 1 dla wiadomości typu 'ARP reply' (odpowiedz), Wartość kodu 2 dla wiadomości typu 'ARP request' (zapytanie). Adres MAC nadawcy, (Sender Hardware Address). Wielkość: wartość z pola 'Hardware Address Length'. Adres MAC hosta wysyłającego ARP request. Adres nadawcy, (Sender Protocol Address). Wielkość: wartość z pola 'Protocol Address Length'. Adres IP hosta wysyłającego ARP request. Adres MAC odbiorcy, (Target Hardware Address). Wielkość: wartość z pola 'Hardware Address Length'. Adres MAC hosta odbierającego wiadomość. Adres odbiorcy, (Target Protocol Address). Wielkość: wartość z pola 'Protocol Address Length'. Adres IP hosta odbierającego wiadomość. 4

Przykład: Adres fizyczny 00-B0-D0-2C-FC-B6 Struktura adresu MAC karty sieciowej Pole I/G. Wartości: 0/1. 1 bit. Znaczenie: adres Indywidualny/Grupowy. Pole U/L. Wartości: 0/1. 1 bit. Znaczenie: adres Uniwersalny/Lokalny. Adres Univerwersaly: Karty sieciowe uniwersalne są zgodne ze standardem IEEE. Adres Lokalny: Karty z takim adresem mogą nie być zgodne ze standardem IEEE. Pole OUI (Organization Unique Identifier). 22 bity. Część adresu MAC określająca producenta karty sieciowej. Pole 24 bity. Znaczenie: numer karty sieciowej. Numer karty sieciowej przydzielany przez producenta karty. Przykłady kodów producentów kart: 00000C Cisco 0000D8 3Com, Novell PS/2 0080C2 IEEE 802.1 Committee 00AA00 Intel 02608C 3Com IBM PC; Imagen; Valid; Cisco 080020 Sun machines Przykład: Karta o adresie 08:00:20:00:70:DF została wyprodukowana przez Sun Microsystems. 5

Specyfikacja projektu Nazwa projektu: IpArp Typ projektu : Win32 console application Lista plików : IpArp.cpp Kompilacja : Microsoft Visual C++ 2008. Wkopiować pliki svcrt.lib iphlpapi.lib WS2_32.Lib do katalog projektu. W Project-> Setings-> Link-> Object/Library Modules-> Dodać: WS2_32.Lib iphlpapi.lib Funkcjonalność: \> printarp // kieruje na ekran zawartość tablicy arp. Przykład: \>printarp \> Interfejs: 10.60.17.94 --- 0x2 Adres internetowy Adres fizyczny Typ 10.60.17.5 00-02-a5-cd-37-c4 dynamiczne 6

Struktura progamu Pliki nagłówkowe: windows.h, iphlpapi.h, iptypes.h, iostream. Funkcje programu: WSAStartup(), WSACleanup(), inet_ntoa(), GetIpNetTable(), GetIpAddrTable() PrintIpNetTable(), MyGetIpNetTable(), MyGetIpAddrTable(), PhysAddrToString(), StringToPhysAddr(), InterfaceIdxToInterfaceIp(), Struktury programu: WSADATA, MIB_IPNETTABLE, MIB_IPADDRTABLE, in_addr, MIB_IPNETROW Zmienne programu: WORD wversionrequested = MAKEWORD(1,1); WSADATA wsadata; int nret; DWORD dwstatus; PMIB_IPNETTABLE piparptab = NULL; 7

Specyfikacja Struktury WSADATA Nazwa struktury : WSADATA Opis : Struktura WSADATA zawiera informacje o implementacji gniazd (Windows Sockets). Struktura WSADATA jest zadeklarowana w pliku Winsock2.h. Aplikacja nie powinna używać atrybutów imaxsockets, imaxudpdg, i lpvendorinfo struktury WSAData gdy wartość atrybutu wversion, po wywołaniu WSAStartup jest co najmniej 2. Wyjaśnienie: This is because the architecture of Windows Sockets has been changed in version 2 to support multiple providers, and WSAData no longer applies to a single vendor's stack. Two new socket options are introduced to supply provider- specific information: SO_MAX_MSG_SIZE (replaces the imaxudpdg element) and PVD_CONFIG (allows any other provider-specific configuration to occur). Atrybuty : wversion - Wersja gniazd WinSock którą ma używać biblioteka Ws2_32.dll. whighversion - Najwyższa wersja WinSock jaką może używać biblioteka.dll. Standardowo, wartość taka sama, jak wversion. szdescription - Zerem zakończony string znaków ASCI (null-terminated ASCII string) do którego Ws2_32.dll kopiuje opis implementacji gniazd. Tekst (do 256 znaków) może być używany do opisów wiadomości. szsystemstatus - Zakończony zerem string znaków ASCI do którego WSs2_32.dll kopiuje informacje o statusie lub konfiguracji. Ws2_32.dll powinna używać tego atrybutu do tylko gdy informacje mogą być ważne dla użytkowników, atrybut nie powinien być traktowany jako rozszerzenie zmiennej szdescription. imaxsockets - Pozostawiony dla zgodności poprzednimi wersjami gniazd. Parametr powinien być ignorowany przez Windows Socketsv.2 i wersje późniejsze (nie ma już jednej wartości dla wszystkich dostarczycieli usług). imaxudpdg - Atrybut ignorowany przez gniazda wersji 2 i następne. imaxudpdg pozostawiony dla zgodności z wersją gniazd Windows Sockets 1.1. Nie powinien być używany przy budowaniu nowych aplikacji. Dla określenia wielkości wiadomości dostarczyciela usług dla gniazda i typu gniazda aplikacje powinny używać getsockopt aby uzyskać wartość opcji SO_MAX_MSG_SIZE. lpvendorinfo - Atrybut ignorowany przez Windows Sockets v.2 i następne. lpvendorinfo pozostawiono dla zgodności z wersją gniazd Windows Sockets 1.1. Dla określenia konfiguracji dostarczyciela usług dla gniazda powinny używać getsockopt aby uzyskać wartość opcji PVD_CONFIG. 8

Specyfikacja struktury MIB_IPNETTABLE Nazwa struktury : MIB_IPNETTABLE Opis : Struktura MIB_IPNETTABLE zawiera tablicę z danymi ARP. Atrybuty : dwnumentries Liczba rekordów w tabeli ARP. table - Wskaźnik do tablicy ARP implementowanej jako tablica struktur MIB_IPNETROW. Implementacja struktury MIB_IPNETTABLE: typedef struct _MIB_IPNETTABLE DWORD dwnumentries; MIB_IPNETROW table[any_size]; MIB_IPNETTABLE, *PMIB_IPNETTABLE; 9

Specyfikacja struktury MIB_IPNETROW Nazwa struktury: MIB_IPNETROW Opis : Struktura MIB_IPNETROW zawiera dane do rekordów tablicy ARP. Atrybuty : dwindex - Indeks karty sieciowej. dwphysaddrlen - Długość adresu fizycznego karty sieciowej. bphysaddr - Określa adres fizyczny karty sieciowej. dwaddr - Określa adres IP karty sieciowej. dwtype - Określa typ rekordu ARP. Możliwe typy rekordów ARP: 4 Static, 3 Dynamic, 2 Invalid, 1 inne. Implementacja struktury MIB_IPNETROW: typedef struct _MIB_IPNETROW DWORD dwindex; DWORD dwphysaddrlen; BYTE bphysaddr[maxlen_physaddr]; DWORD dwaddr; DWORD dwtype; MIB_IPNETROW, *PMIB_IPNETROW; 10

Specyfikacja struktury MIB_IPADDRTABLE Nazwa struktury: MIB_IPADDRTABLE Opis : Struktura MIB_IPADDRTABLE zawiera tablicę adresów IP. Atrybuty : dwnumentries Określa numer adresu IP w tablicy. table Wskaźnik do rekordu w tablicy implementowanej jako tablica struktur MIB_IPADDRROW. Implementacja struktury PMIB_IPADDRTABLE: typedef struct _MIB_IPADDRTABLE DWORD dwnumentries; MIB_IPADDRROW table[any_size]; MIB_IPADDRTABLE, *PMIB_IPADDRTABLE; typedef struct _MIB_IPADDRROW DWORD dwaddr; //The IPv4 address in network byte order. DWORD dwindex; // Index of nterface associated with this IPv4 address. DWORD dwmask; // Subnet mask for the IPv4 address in network byte order. DWORD dwbcastaddr; // The broadcast address in network byte order. DWORD dwreasmsize; // Maximum re-assembly size for received datagrams. unsigned short unused1; unsigned short wtype; // The address type or state. MIB_IPADDRROW, *PMIB_IPADDRROW; 11

Specyfikacja struktury in_addr Nazwa struktury : in_addr Opis: Struktura in_addr adres IP hosta. Struktura zdefiniowana w WINSOCK.H Atrybuty : S_un_b - adres hosta w formacie u_chars. S_un_w - adres hosta w formacie dwóch u_shorts. S_addr - adres hosta w formacie u_long. Implementacja struktury in_addr: struct ; in_addr union struct unsigned char s_b1, s_b2, s_b3, s_b4; S_un_b; struct unsigned short s_w1, s_w2; S_un_w; unsigned long S_addr; S_un; 12

Specyfikacja funkcji WSAStartup() Nazwa funkcji : WSAStartup() Zwracana wartość: int WSAStartup() zwraca zero gdy wywołanie funkcji zakończyło się sukcesem. W innym przypadku zwraca następujące kody błędów: WSASYSNOTREADY Wskazuje, że sieć lub podsieć nie jest przygotowana do transmisji danych. WSAVERNOTSUPPORTED Żądana wersja WinSock nie jest obsługiwana przez implementację WinSock. WSAEINPROGRESS Trwa operacja blokowania WinSock 1.1 WSAEPROCLIM - WSAEFAULT - Osiągnięto granicę liczby zadań dopuszczalną przez WinSock. Błędna wartość wskaźnika lpwsadata (not a valid pointer). Argumenty: WORD wversionrequested - LPWSADATA lpwsadata - [in] Najwyższa obsługiwana wersja WinSock, którą nadawca (caler) może użyć. Bajt najwyższy określa minimalną wersję, najniższy bajt określa maksymalna wersję. [out] Wskaźnik do struktury WSADATA. Opis: Funkcja WSAStartup() inicjuje użycie przez proces biblioteki WS2_32.DLL. Funkcja WSAStartup() musi być pierwszą funkcja Windows Sockets wywołana przez aplikacje. 13

Specyfikacja funkcji WSACleanup() Nazwa funkcji: WSACleanup() Zwracana wartość: int WSACleanup() zwraca zero gdy wywołanie funkcji zakończyło się sukcesem. W innym przypadku zwraca SOCKET_ERROR, i określony kod błędu może być uzyskany poprzez wywołanie finkcji WSAGetLastError(): WSANOTINITIALISED - Przed wywołaniem tej funkcji WSACleanup() musi być wywołana z sukcesem funkcja WSAStartup(). WSAENETDOWN - Awaria sieci (network subsystem has failed). WSAEINPROGRESS - Trwa operacja blokowania WinSock 1.1 lub dostarczyciel usługi (service provider) obsługuje komunikat zwrotny (a callback function). Argumenty: brak Opis: Funkcja WSACleanup() kończy użycie biblioteki WS2_32.DLL. 14

Specyfikacja funkcji inet_ntoa() Nazwa funkcji: inet_ntoa() Zwracana wartość: char* FAR Jeżeli nie ma błędów inet_ntoa() zwraca wskaźnik char* do statycznego bufora zawierającego adres w standardzie kropkowanym. W pozostałych przypadkach funkcja zwraca NULL. Argumenty : struct in_addr in in - [in] Wskaźnik do struktury in_addr reprezentującej adres IP hosta. Opis : Funkcja inet_ntoa() konwertuje adres IPv4 na adres w formacie kropkowanym (dotted format). 15

Specyfikacja funkcji inet_addr() Nazwa funkcji : inet_addr() Zwracana wartość: unsigned long Argumenty : const char* cp cp - [in] Zerem zakończony string znaków reprezentujący adres IP zapisany w notacji kropkowanej (np. 127.0.0.1). Opis : Funkcja inet_addr() konwertuje string zawierający adres IPv4 w wersji kropkowanej na odpowiedni adres w strukturze IN_ADDR. 16

Specyfikacja funkcji GetIpNetTable() Nazwa funkcji : GetIpNetTable() Zwracana wartość: DWORD Argumenty : pipnettable - [out] Wskaźnik do bufora który przechowuje adres tablicę danych adres IP- adres MAC w strukturze MIB_IPNETTABLE. pdwsize - [in, out] Na wejściu wskaźnik do zmiennej przechowującej wielkość bufora (zmiennej wskazywanej przez pipnettable). Na wyjściu, jeżeli bufor jest za mały na zwracaną tablicę danych, funkcja ustawia wartość tego parametru na wielkość wymaganą. border - [in] Argument określa czy zwracana tablica ma być uporządkowana według rosnących adresów IP (tablica jest uporządkowana gdy parametr ma wartość TRUE. Opis : Funkcja pobiera dane zawierające przyporządkowanie adres IP adres MAC (tablica ARP). Deklaracja funkcji w pliku iphlpapi.h. 17

Specyfikacja funkcji GetIpAddrTable() Nazwa funkcji : GetIpAddrTable() Zwracana wartość: DWORD Argumenty : pipaddrtable - [out] Wskaźnik do bufora który przechowuje adres tablicę danych karta - adres IP w strukturze MIB_IPADDRTABLE. pdwsize - [in, out] Na wejściu wskaźnik do zmiennej przechowującej wielkość bufora (zmiennej wskazywanej przez pipaddrtable). Na wyjściu, jeżeli bufor jest za mały na zwracaną tablicę danych, funkcja ustawia wartość tego parametru na wielkość wymaganą. border - [in] Argument określa czy zwracana tablica ma być uporządkowana według rosnących adresów IP (tablica jest uporządkowana gdy parametr ma wartość TRUE. Opis : Funkcja GetIpAddrTable() pobiera dane o przyporządkowaniu karty sieciowej do adresu IP. 18

Implementacja funkcji InterfaceIdxToInterfaceIp() bool InterfaceIdxToInterfaceIp(PMIB_IPADDRTABLE pipaddrtable, DWORD dwindex, char str[]) struct in_addr inadtmp; char *szipaddr; if (pipaddrtable == NULL str == NULL) return FALSE; str[0] = '\0'; for (DWORD dwidx = 0; dwidx < pipaddrtable->dwnumentries; dwidx++) if (dwindex == pipaddrtable->table[dwidx].dwindex) inadtmp.s_addr = pipaddrtable->table[dwidx].dwaddr; szipaddr = inet_ntoa(inadtmp); if (szipaddr) strcpy(str, szipaddr); return TRUE; else return FALSE; return FALSE; 19

Implementacja funkcji StringToPhysAddr() int StringToPhysAddr(char* szinether, char* szoutether) const char DASH = '-'; register char c; register int val; if (strlen(szinether)!= 17) return (-1); if (szinether[2]!= DASH szinether[5]!= DASH szinether[8]!= DASH szinether[8]!= DASH szinether[14]!= DASH) return (-1); if (!isxdigit(szinether[0])!isxdigit(szinether[1])!isxdigit(szinether[3])!isxdigit(szinether[4])!isxdigit(szinether[6])!isxdigit(szinether[7])!isxdigit(szinether[9])!isxdigit(szinether[10])!isxdigit(szinether[12])!isxdigit(szinether[13])!isxdigit(szinether[15])!isxdigit(szinether[16])) return (-1); for (int i = 0; i < 6; i++) val = 0; c = toupper(szinether[i*3]); c = c - (isdigit(c)? '0' : ('A' - 10)); val += c; val = (val << 4); c = toupper(szinether[i*3 + 1]); c = c - (isdigit(c)? '0' : ('A' - 10)); val += c; szoutether[i] = val; return 0; 20

Implementacja funkcji PhysAddrToString() bool PhysAddrToString(BYTE PhysAddr[], DWORD PhysAddrLen, char str[]) if (PhysAddr == NULL PhysAddrLen == 0 str == NULL) return FALSE; str[0] = '\0'; for (DWORD dwidx = 0; dwidx < PhysAddrLen; dwidx++) if (dwidx == PhysAddrLen-1) sprintf(str+(dwidx*3), "%02X", ((int)physaddr[dwidx])&0xff); else sprintf(str+(dwidx*3), "%02X-", ((int)physaddr[dwidx])&0xff); return TRUE; 21

Implementacja funkcji PrintIpNetTable() void PrintIpNetTable(PMIB_IPNETTABLE pipnettable) DWORD i, dwstatus, dwcurrindex; struct in_addr inadtmp; char szprintablephysaddr[256]; char sztype[128]; char szipaddr[128]; PMIB_IPADDRTABLE pipaddrtable = NULL; if (pipnettable == NULL) printf( "pipnettable == NULL in line %d\n", LINE ); return; if ( (dwstatus = MyGetIpAddrTable(pIpAddrTable))!= NO_ERROR) printf("getipaddrtable returned 0x%x\n", dwstatus); if (pipaddrtable) delete [] pipaddrtable; return; dwcurrindex = pipnettable->table[0].dwindex; if (InterfaceIdxToInterfaceIp(pIpAddrTable, dwcurrindex, szipaddr)) printf("\ninterface: %s on Interface 0x%X\n", szipaddr, dwcurrindex); printf(" Internet Address Physical Address Type\n"); else printf("error: Could not convert Interface number 0x%X to IP address.\n", pipnettable->table[0].dwindex); return; 22

Implementacja funkcji PrintIpNetTable() for (i = 0; i < pipnettable->dwnumentries; ++i) if (pipnettable->table[i].dwindex!= dwcurrindex) dwcurrindex = pipnettable->table[i].dwindex; if (InterfaceIdxToInterfaceIp(pIpAddrTable, dwcurrindex, szipaddr)) printf("interface: %s on Interface 0x%X\n", szipaddr, dwcurrindex); printf(" Internet Address Physical Address Type\n"); else printf("error: Could not convert Interface number 0x%X to IP address.\n", pipnettable->table[0].dwindex); return; PhysAddrToString(pIpNetTable->table[i].bPhysAddr, pipnettable->table[i].dwphysaddrlen, szprintablephysaddr); inadtmp.s_addr = pipnettable->table[i].dwaddr; switch (pipnettable->table[i].dwtype) case 1: strcpy(sztype,"other"); break; case 2: strcpy(sztype,"invalidated"); break; case 3: strcpy(sztype,"dynamic"); break; case 4: strcpy(sztype,"static"); break; default: strcpy(sztype,"invalidtype"); printf(" %-16s %-17s %-11s\n", inet_ntoa(inadtmp), szprintablephysaddr, sztype); if (pipaddrtable) delete [] pipaddrtable; 23

Implementacja funkcji MyGetIpNetTable() DWORD MyGetIpNetTable(PMIB_IPNETTABLE& pipnettable, bool forder) DWORD status = NO_ERROR; DWORD statusretry = NO_ERROR; DWORD dwactualsize = 0; dwactualsize = 0; status = GetIpNetTable(pIpNetTable, &dwactualsize, forder); if (status == NO_ERROR) return status; else if (status == ERROR_INSUFFICIENT_BUFFER) pipnettable = new MIB_IPNETTABLE [dwactualsize]; statusretry = GetIpNetTable(pIpNetTable, &dwactualsize, forder); 24

Implementacja funkcji MyGetIpNetTable() if (statusretry!= NO_ERROR) #ifdef _DEBUG printf("retry failed.\n"); #endif return statusretry; else return statusretry; else #ifdef _DEBUG printf("first getipnettable call failed\n"); #endif return status; 25

Implementacja funkcji MyGetIpAddrTable() DWORD MyGetIpAddrTable(PMIB_IPADDRTABLE& pipaddrtable, bool forder) DWORD status = NO_ERROR; DWORD statusretry = NO_ERROR; DWORD dwactualsize = 0; // query for buffer size needed status = GetIpAddrTable(pIpAddrTable, &dwactualsize, forder); if (status == NO_ERROR) printf("no error\n"); return status; else if (status == ERROR_INSUFFICIENT_BUFFER) pipaddrtable = new MIB_IPADDRTABLE [dwactualsize]; statusretry = GetIpAddrTable(pIpAddrTable, &dwactualsize, forder); return statusretry; else return status; 26

Struktura programu 1. Sprawdzenie wersji winsock. nret = WSAStartup(wVersionRequested, &wsadata); Czy wsadata.wversion!= wversionrequested? 2. Pobranie danych z tablic arp dwstatus = MyGetIpNetTable(pIpArpTab, TRUE)) == NO_ERROR 3. Przekazanie na ekran dnaych o tablicy arp. PrintIpNetTable(pIpArpTab); 4. Zakończenie użycia biblioteki winsock WS2_32.DLL. WSACleanup(); 27

Struktura funkcji main() int main(int argc, char **argv) WORD wversionrequested = MAKEWORD(1,1); WSADATA wsadata; int nret; nret = WSAStartup(wVersionRequested, &wsadata); if (wsadata.wversion!= wversionrequested) cerr << "WinSock version: " << LOBYTE(wVersionRequested) <<"." << HIBYTE(wVersionRequested) << " not supported" << endl; WSACleanup(); return 1; DWORD dwstatus; PMIB_IPNETTABLE piparptab = NULL; if ((dwstatus = MyGetIpNetTable(pIpArpTab, TRUE)) == NO_ERROR) PrintIpNetTable(pIpArpTab); delete [] piparptab; return 1; else if ( dwstatus == ERROR_NO_DATA) cerr<< "No entries in arpcache." <<endl; return 1; else if (piparptab) delete [] piparptab; cout <<"IpArp returned: " << dwstatus << endl; return 1; WSACleanup(); return 0; 28