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.
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;