Определение IP сайта

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by marcos, 28 Jan 2010.

  1. marcos

    marcos New Member

    Joined:
    8 Nov 2009
    Messages:
    111
    Likes Received:
    1
    Reputations:
    -5
    Всем привет! Подскажите как определить IP у сайта[delphi]
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    gethostbyname в winsock
     
  3. 0rs

    0rs Member

    Joined:
    30 Dec 2008
    Messages:
    70
    Likes Received:
    23
    Reputations:
    3
    Code:
    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;
    
    Ошибки проверяй сам
     
    #3 0rs, 28 Jan 2010
    Last edited: 28 Jan 2010
  4. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Главная ошибка многие - это писать в Делфи как хочется, а не как надо )
    Я имею в виду правильность написания имен апи функция.
    GetHostByName считается не правильным написание. Правильное gethostbyname итп.
    и дело не в том что в делфи пофигу на регистр а в Си нет. А в том что это имена апишек и если искать их через GetProcAddress то важен регистр символов.

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

    0rs Member

    Joined:
    30 Dec 2008
    Messages:
    70
    Likes Received:
    23
    Reputations:
    3
    Поправил регистр имен, но на С/С++ можно написать и более красиво, к тому же используется функция PInAddr которая есть только в Delphi.
     
  6. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    PInAddr это не функция это тип. И ты юзаешь его для преобразования.

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

    Code:
    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;
    }
    
    
     
  7. Gar|k

    Gar|k Moderator

    Joined:
    20 Mar 2009
    Messages:
    1,166
    Likes Received:
    266
    Reputations:
    82
    slesh функция хороша и интелектуально понятно, но есть два факта
    1) host ведь можно указать строкой "127.0.0.1"

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

    Code:
    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
     
    _________________________