peterzig

[PWŚS] Adresy Exception

Mar 7th, 2017
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.95 KB | None | 0 0
  1. #include <winsock.h>
  2. #include <stdio.h>
  3. #include <iostream>
  4. #include <string>
  5. #include <exception>
  6. #pragma comment (lib,"ws2_32.lib")
  7.  
  8. using namespace std;
  9.  
  10. // Klasa wyjątku obsługująca nieprawidłową inicjalizację biblitoeki sieciowej WinSock
  11. class StartupException : public exception
  12. {
  13. public:
  14.     int err;
  15.     char error[60]; // zmienna przechowująca tekstowy
  16.     StartupException(int error) : err(error){}
  17.     const char* what() throw()  // przeciążanie metody what klasy exception, czyli piszemy własną wersję
  18.     {
  19.         // formatujemy komunikat wyjątku wstawiając do niego kod błędu wygenerowany z zewnątrz (err)
  20.         sprintf(error, "Nieudana inicjalizacja biblioteki WinSock. Kod bledu: %d", err);
  21.         return error;
  22.     }
  23.     ~StartupException() {}
  24. };
  25.  
  26. // Klasa wyjątku obsługująca nieprawidłowy adres
  27. class AdresyException : public exception
  28. {
  29. public:
  30.     AdresyException() {}
  31.     const char* what() throw()
  32.     {
  33.         return "Blad pobrania adresow: ";
  34.     }
  35. };
  36.  
  37. // Klasa obsługująca inicjalizację biblioteki sieciowej WinSock
  38. class WinSockInit
  39. {
  40.     WSADATA wsaData;
  41. public:
  42.     WinSockInit ()
  43.     {
  44.         int result = WSAStartup(MAKEWORD(2, 2), &wsaData);
  45.         if (result != NO_ERROR) // jeśli inicjalizacja się nie powiodła to rzucamy naszym wyjatkiem
  46.             throw StartupException(result);
  47.         cout << "\nBiblioteka WinSock zainicjalizowana poprawnie." << endl;
  48.     }
  49.     ~WinSockInit()  // Destruktor klasy
  50.     {
  51.         WSACleanup();   // zwolnienie biblioteki WinSock
  52.         cout << "\nUsunieto z pamieci biblioteke WinSock." << endl;
  53.     }
  54. };
  55.    
  56. class IpAddreses
  57. {
  58. private:
  59.     struct hostent* adresy; // struktura przechowująca informacje o adresach pobranych dla danej domeny
  60.     in_addr addr;       // struktura przechowująca informacje o adresie
  61. public:
  62.     IpAddreses(){}
  63.  
  64.     void setAdresyDomeny(const char* hostname)
  65.     {
  66.         adresy = gethostbyname(hostname);   // pobieramy informacje o adresach podanego hosta
  67.         if (adresy == NULL)     // jeśli nie udało się pobrać informacji to rzucamy wyjątkiem
  68.             throw AdresyException();
  69.     }
  70.  
  71.     char* operator[] (int i)    // przeciążanie operatora indeksowania
  72.     {
  73.         if(!adresy->h_addr_list[i]) // jeśli adres jest zerowy to zwracamy null. Oznacza to brak dalszych adresów
  74.             return NULL;
  75.         addr.s_addr = *(u_long *)adresy->h_addr_list[i];    // rzutujemy pobrany adres na postać unsinged long
  76.         return inet_ntoa(addr);     // konwersja na postać łańcucha znaków (adres IP właściwy)
  77.     }
  78.     ~IpAddreses(){}
  79. };
  80. // Funkcja wyświetlająca pobrane adresy z domeny. Korzysta ona z przeciążonego operatora indeksowania
  81. void Wyswietl(IpAddreses ipadr)
  82.     {
  83.         int i = 0;
  84.             while (ipadr[i])    // Pętla iterująca po adresach
  85.                 printf("Adresy IP: %s\n", ipadr[i++]);
  86.     }
  87.  
  88. int main()
  89. {
  90.     try
  91.     {
  92.         WinSockInit WinSockLibInit = WinSockInit(); // inicjalizacja WinSock
  93.         IpAddreses adresses = IpAddreses();         // przygotowanie obiektu przechowującego adresy
  94.        
  95.         while (true)    // pętla seterująca cyklicznym pobieraniem domeny od użytkownika i wyświetlaniem dla niej adresów
  96.         {
  97.             static char adresDomeny[255];   // adres domeny podanej przez użytkownika
  98.             printf("Wprowadz nazwe domeny, z ktorej chcesz pobrac adresy. Pusty znak oznacza koniec.\nDomena:  ");
  99.             gets_s(adresDomeny);    //pobieramy adres domeny
  100.            
  101.             if (strlen(adresDomeny) == 0)   // jeśli podano pusty ciąg znaków to kończymy program
  102.             {
  103.                 printf("\nZakonczenie programu.\n");
  104.                 system("pause");
  105.                 return 0;
  106.             }
  107.             try
  108.             {
  109.                 adresses.setAdresyDomeny(adresDomeny);  // wpisujemy do obiektu adres domeny
  110.                 Wyswietl(adresses);         // wyświetlamy skonwertowane już adresy na postać ciągu znaków
  111.             }
  112.             catch (AdresyException &e)
  113.             {
  114.                 cout << e.what() << " " << WSAGetLastError() << endl;   // przechwytujemy wyjątek w razie nieprawidłowego adresu domeny
  115.             }
  116.         }
  117.     }
  118.     catch (StartupException &e)     // przechwytujemy wyjątek w razie nieprawidłowej inicjalizacji WinSock
  119.     {
  120.         cout << e.what() << endl;
  121.         system("pause");
  122.         return 0;
  123.     }
  124.  
  125.     system("pause");
  126.     return 0;
  127. }
Add Comment
Please, Sign In to add comment