Jak sprawdzić host na podstawie adresu IP

lofix

Śmobry..
Czasami przydać się może nam funkcja pobierająca Adres IP i zwracająca nam Adres DNS..

Do dzieła..

w sekcji uses dodajemy moduł WinSocks

Potem wklepujemy poniższą funkcję..

function IPAddrToName(IPAddr : String): String;
var 
  SockAddrIn: TSockAddrIn; 
  HostEnt: PHostEnt; 
  WSAData: TWSAData; 
begin 
  WSAStartup($101, WSAData); 
  SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(IPAddr)); 
  HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); 
  if HostEnt<>nil then
  begin
    result:=StrPas(Hostent^.h_name)
  end 
  else 
  begin 
    result:=''; 
  end; 
end;

Potem wystarczy już tylko dać pod jakiś button ten kodzik:


Host1.text:= IPAddrToName(Edit1.Text);

Host1 to komponent Tedit

Żeby usprawnić nasz prościutki program można dodać kod do Edita, w który wpisujemy adres IP. Pozwoli nam to wpisywać tylko cyfry i kropki..

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', '.']) then 
Key := #0;
end;

Dodatkowo można dodać procedurę, która nam poda adres IP na podstawie wpissanego DNSa...

procedure TForm1.HostNaIP(Sender: TObject); 
type pu_long = ^u_long; 
var WSAData : TWSAData; 
HostEnt : PHostEnt; 
InAddr : TInAddr; 
begin 
If WSAStartup($101, WSAData)<>0 Then 
Label2.Caption := 'Wystąpił błąd WSAStartup()'
else begin 
HostEnt:=GetHostByName(JakisEdit.Text); 
InAddr.S_addr:=u_long(pu_long(HostEnt^.h_addr_list^)^); 
Label2.Caption :=inet_ntoa(InAddr); 
End; 
WSACleanup; 
end;

A oto cały listing prościutkiego programu..
Potrzebne:
2 x TEdit
1 x TButton
2 x TLabel


unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls,winsock;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Host1: TMemo;
    Button1: TButton;
    Label1: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Edit1KeyPress(Sender: TObject; var Key: Char);
    procedure Edit1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function IPAddrToName(IPAddr : String): String;
var 
  SockAddrIn: TSockAddrIn; 
  HostEnt: PHostEnt; 
  WSAData: TWSAData; 
begin 
  WSAStartup($101, WSAData); 
  SockAddrIn.sin_addr.s_addr:= inet_addr(PChar(IPAddr)); 
  HostEnt:= gethostbyaddr(@SockAddrIn.sin_addr.S_addr, 4, AF_INET); 
  if HostEnt<>nil then
  begin
    result:=StrPas(Hostent^.h_name)
  end 
  else 
  begin 
    result:=''; 
  end; 
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
//pobieranie DNSa
Label1.Caption:= 'Czekaj...Trwa pobieranie danych';
Host1.text:= IPAddrToName(Edit1.Text);
Label1.Caption := 'Pobieranie zakończone';
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
if not (Key in ['0'..'9', '.']) then Key := #0;
//Kod determinujący wpisywanie tylko cyfr i kropek..
end;

procedure TForm1.Edit1Click(Sender: TObject);
begin
Edit1.Clear;
//jeżeli klikniemy w Edit na adres IP zostanie on wyczyszczony
end;

end.

2 komentarzy

Chciałeś i masz

hehehe stary zle skopiowales moja podpowiedz z FAQ-a z jednej strony :P Chodzi mi o HostToIP, calosc wygalda tak:

uses Winsock;
...
procedure TForm1.HostNaIP(Sender: TObject);
type pu_long = ^u_long;
var WSAData : TWSAData;
HostEnt : PHostEnt;
InAddr : TInAddr;
begin
If WSAStartup($101, WSAData)<>0 Then
Label1.Caption := 'Wystąpił błąd!'
Else Begin
HostEnt:=GetHostByName('www.onet.pl');
InAddr.S_addr:=u_long(pu_long(HostEnt.h_addr_list)^);
Label1.Caption :=inet_ntoa(InAddr);
End;
WSACleanup;
end;