Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Определение IP сайта (https://forum.antichat.xyz/showthread.php?t=174097)

marcos 28.01.2010 09:23

Определение IP сайта
 
Всем привет! Подскажите как определить IP у сайта[delphi]

slesh 28.01.2010 10:31

gethostbyname в winsock

0rs 28.01.2010 10:31

Код:

uses Winsock;

function GetIPFromHost(HostName:PChar): string;
var
        HEnt: pHostEnt;
        WSAData: TWSAData;
begin
        WSAStartup($0101, WSAData);
        HEnt := gethostbyname(HostName);
        Result := inet_ntoa(PInAddr(HEnt^.h_addr_list^)^ );
        WSACleanup;
end;

Ошибки проверяй сам

slesh 28.01.2010 10:40

Главная ошибка многие - это писать в Делфи как хочется, а не как надо )
Я имею в виду правильность написания имен апи функция.
GetHostByName считается не правильным написание. Правильное gethostbyname итп.
и дело не в том что в делфи пофигу на регистр а в Си нет. А в том что это имена апишек и если искать их через GetProcAddress то важен регистр символов.

ПО этому лучше писать всё сразу в сишном стиле. Потому как это будет более удобно для переписывания на С/С++ (если конечно такое понадобиться когданить ))

0rs 28.01.2010 11:03

Поправил регистр имен, но на С/С++ можно написать и более красиво, к тому же используется функция PInAddr которая есть только в Delphi.

slesh 28.01.2010 13:34

PInAddr это не функция это тип. И ты юзаешь его для преобразования.

А на си можно и так сделать, чтобы получить адрес сразу в готовом для использовании виде. Ну и в делфи тож можно также делать.

Код:

ULONG Host2Ip(char * host)
{
        struct hostent * p;
        ULONG ret;

        p = gethostbyname(host);
        if (p)
        {
                ret = *(ULONG*)(p->h_addr);
        }
        else
        {
                ret = INADDR_NONE;
        }

        return ret;
}


Gar|k 28.01.2010 16:18

slesh функция хороша и интелектуально понятно, но есть два факта
1) host ведь можно указать строкой "127.0.0.1"

Цитата:

Сообщение от Самоучитель игры на WINSOCK (c)Крис Касперски
sockaddr_in dest_addr;
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(PORT);
HOSTENT *hst;

// преобразование IP адреса из символьного в сетевой формат
if (inet_addr(SERVERADDR) != INADDR_NONE)
dest_addr.sin_addr.s_addr = inet_addr(SERVERADDR);
else
{
// попытка получить IP адрес по доменному имени сервера
if (hst = gethostbyname(SERVERADDR))
// hst->h_addr_list содержит не массив адресов,
// а массив указателей на адреса
((unsigned long *)&dest_addr.sin_addr)[0] =
((unsigned long **)hst->h_addr_list)[0][0];
else
{
printf("Invalid address %s\n", SERVERADDR);
closesocket(my_sock);
WSACleanup();
return -1;
}
}

2) gethostbyname - у одного адреса может быть несколько ip адресов на то и массив в структуре HOSTENT

Код:

struct hostent
{
    char FAR * h_name;            // официальное имя узла
    char FAR * FAR * h_aliases;  // альтернативные имена узла (массив строк)
    short h_addrtype;            // тип адреса
    short h_length;              // длина адреса (как правило AF_INET)
    char FAR * FAR * h_addr_list; // список указателей на IP-адреса
                                  // ноль - конец списка
};

хотя и я ленюсь это учитывать :D


Время: 21:54