Главная > Программирование > Как определить все IP адреса сервера по доменному имени

Как определить все IP адреса сервера по доменному имени

Немного теории. Каждый компьютер в сети Internet, да и просто в локальной сети имеет IP адрес, который представляет из себя структуру из 4х байт, и уникален для всей сети. IP адрес принято записывать числами в десятичном виде с разделительными точками. Например: 213.180.204.11 Использование IP адресов для обращения к серверу неудобно, т.к. сложно запомнить и вообще выглядит устрашающе, поэтому была введена служба доменных имён, которая сопоставляет каждому IP адресу вполне человеческое имя. Например: 213.180.204.11 это IP www.yandex.ru. По имени (или адресу) www.yandex.ru можно обратиться к серверу и получить запрашиваемый трафик, аналогично можно набрать в строке адреса 213.180.204.11 и получить точно такой же результат. Оказывается одному доменному имени могут соответствовать несколько IP адресов, т.е. по любому из данных IP можно обратиться к серверу или удалённому компьютеру.

В сети я не разу не встречал алгоритмов, которые бы позволяли определить список всех IP адресов домена. Все предлагаемые исподники позволяли получить лишь один адрес домена. В этой статье я покажу, как можно получить ВСЕ адреса домена. Использовать будем стандартные функции библиотеки WinSock2.
Короче функция такая:

void DecToString(char byte0, char byte1, char byte2, char byte3, char ipres[255]) // функция преобразования десятичного IP адреса в строку
{
   char strtemp[4];

   itoa(byte0,strtemp,10);
   strcat(ipres,strtemp);
   strcat(ipres,".");
   itoa(byte1,strtemp,10);
   strcat(ipres,strtemp);
   strcat(ipres,".");
   itoa(byte2,strtemp,10);
   strcat(ipres,strtemp);
   strcat(ipres,".");
   itoa(byte3,strtemp,10);
   strcat(ipres,strtemp);
   strcat(ipres,"\r\n");
}

int DomainToIPList(char domain[255],char iplistdec[10][4], char iplist[255])
{
iplist[0]='\0'; // первоначально очистим строку результата
WSADATA wsd;
int i=0;
int err=WSAStartup(MAKEWORD(2,0),&wsd); // запуск WINSOCK2

if (err!=0)
{
   MessageBox(NULL,"WinSock 2.0 library require!","Error",NULL);
   return 0; // если либа не загрузилась, то сразу выход
}

struct hostent *host=NULL; // структура для сохранения результата ресолва
struct sockaddr_in sn; // структура для IP адреса

host=gethostbyname(domain); // главная функция, которая и делает ресолв
if ((host==NULL)||(domain [0]=='\0'))
{
   MessageBox(NULL,"Unable to resolve server","Error",NULL);
}
else
{
   do
   {
      iplistdec[i][0]=host->h_addr_list[i][0];
      iplistdec[i][1]=host->h_addr_list[i][1];
      iplistdec[i][2]=host->h_addr_list[i][2];
      iplistdec[i][3]=host->h_addr_list[i][3];
      DecToString(iplistdec[i][0],iplistdec[i][1],iplistdec[i][2],iplistdec[i][3],iplist);
      i++;
   }
    while (host->h_addr_list[i]!=NULL);
}
WSACleanup();
return i;
}

Функция DomainToIPList преобразует доменное имя, задаваемое параметром domain в IP адрес, который возвращается через параметры iplistdec (двумерный массив десятичных чисел) и iplist (строка, содержащая все IP адреса, каждый адрес заканчивается символами конца строки и возврата каретки). Функция DomainToIPList возвращает количество адресов домена. Основная идея ресолва доменного имени заключается в использовании API функции gethostbyname, которая возвращает нультерминальный список структур, определяющих параметры удалённого сервера.

Использование функции может выглядеть так (при использовании Visual C++ с MFC):

char ipl[255];
char ipd[10][4];
DomainToIPList("localhost",ipd, ipl);
RichEdit1.SetWindowText(ipl);



© 2005 GMC gimix@yandex.ru
Талантов Сергей
Используются технологии uCoz