Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <winsock.h>
- #include <stdio.h>
- #include <iostream>
- #include <string>
- #include <exception>
- #pragma comment (lib,"ws2_32.lib")
- using namespace std;
- // Klasa wyjątku obsługująca nieprawidłową inicjalizację biblitoeki sieciowej WinSock
- class StartupException : public exception
- {
- public:
- int err;
- char error[60]; // zmienna przechowująca tekstowy
- StartupException(int error) : err(error){}
- const char* what() throw() // przeciążanie metody what klasy exception, czyli piszemy własną wersję
- {
- // formatujemy komunikat wyjątku wstawiając do niego kod błędu wygenerowany z zewnątrz (err)
- sprintf(error, "Nieudana inicjalizacja biblioteki WinSock. Kod bledu: %d", err);
- return error;
- }
- ~StartupException() {}
- };
- // Klasa wyjątku obsługująca nieprawidłowy adres
- class AdresyException : public exception
- {
- public:
- AdresyException() {}
- const char* what() throw()
- {
- return "Blad pobrania adresow: ";
- }
- };
- // Klasa obsługująca inicjalizację biblioteki sieciowej WinSock
- class WinSockInit
- {
- WSADATA wsaData;
- public:
- WinSockInit ()
- {
- int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
- if (result != NO_ERROR) // jeśli inicjalizacja się nie powiodła to rzucamy naszym wyjatkiem
- throw StartupException(result);
- cout << "\nBiblioteka WinSock zainicjalizowana poprawnie." << endl;
- }
- ~WinSockInit() // Destruktor klasy
- {
- WSACleanup(); // zwolnienie biblioteki WinSock
- cout << "\nUsunieto z pamieci biblioteke WinSock." << endl;
- }
- };
- class IpAddreses
- {
- private:
- struct hostent* adresy; // struktura przechowująca informacje o adresach pobranych dla danej domeny
- in_addr addr; // struktura przechowująca informacje o adresie
- public:
- IpAddreses(){}
- void setAdresyDomeny(const char* hostname)
- {
- adresy = gethostbyname(hostname); // pobieramy informacje o adresach podanego hosta
- if (adresy == NULL) // jeśli nie udało się pobrać informacji to rzucamy wyjątkiem
- throw AdresyException();
- }
- char* operator[] (int i) // przeciążanie operatora indeksowania
- {
- if(!adresy->h_addr_list[i]) // jeśli adres jest zerowy to zwracamy null. Oznacza to brak dalszych adresów
- return NULL;
- addr.s_addr = *(u_long *)adresy->h_addr_list[i]; // rzutujemy pobrany adres na postać unsinged long
- return inet_ntoa(addr); // konwersja na postać łańcucha znaków (adres IP właściwy)
- }
- ~IpAddreses(){}
- };
- // Funkcja wyświetlająca pobrane adresy z domeny. Korzysta ona z przeciążonego operatora indeksowania
- void Wyswietl(IpAddreses ipadr)
- {
- int i = 0;
- while (ipadr[i]) // Pętla iterująca po adresach
- printf("Adresy IP: %s\n", ipadr[i++]);
- }
- int main()
- {
- try
- {
- WinSockInit WinSockLibInit = WinSockInit(); // inicjalizacja WinSock
- IpAddreses adresses = IpAddreses(); // przygotowanie obiektu przechowującego adresy
- while (true) // pętla seterująca cyklicznym pobieraniem domeny od użytkownika i wyświetlaniem dla niej adresów
- {
- static char adresDomeny[255]; // adres domeny podanej przez użytkownika
- printf("Wprowadz nazwe domeny, z ktorej chcesz pobrac adresy. Pusty znak oznacza koniec.\nDomena: ");
- gets_s(adresDomeny); //pobieramy adres domeny
- if (strlen(adresDomeny) == 0) // jeśli podano pusty ciąg znaków to kończymy program
- {
- printf("\nZakonczenie programu.\n");
- system("pause");
- return 0;
- }
- try
- {
- adresses.setAdresyDomeny(adresDomeny); // wpisujemy do obiektu adres domeny
- Wyswietl(adresses); // wyświetlamy skonwertowane już adresy na postać ciągu znaków
- }
- catch (AdresyException &e)
- {
- cout << e.what() << " " << WSAGetLastError() << endl; // przechwytujemy wyjątek w razie nieprawidłowego adresu domeny
- }
- }
- }
- catch (StartupException &e) // przechwytujemy wyjątek w razie nieprawidłowej inicjalizacji WinSock
- {
- cout << e.what() << endl;
- system("pause");
- return 0;
- }
- system("pause");
- return 0;
- }
Add Comment
Please, Sign In to add comment