Pobieranie IP
Adam Boduch
Nie jest to taka prosta sprawa. Trzeba skorzystać z modułu "Winsock"
tak więc dodaj to słowo do listy "uses" Twojego programu.
Funkcje w tym module opierają się w większości na wskaźnikach tak więc musisz opanować pojęcie wskaźników.
Na początku zaraz po uruchomieniu programu należy załadować samą bibliotekę "Winsock". Dokonuje tego polecenie:
WSAStartup
Trzeba będzie się także postarać o zwolnienie biblioteki podczas zakończenia pracy programu. To wszystko zamieścimy
w sekcji "Initialization" ( uruchamianie programu ) i "finalization"
( kończenie programu ). Tak więc oto kod:
var
VER : WORD;
Data : TWSAData;
initialization
begin
//Ładujemy bibliotekę Winsock
VER := MAKEWORD(1, 0);
WSAStartup(VER, Data);
end;
finalization
WSACleanup; // zwolnij biblioteke Winsock
Teraz jeżeli mamy już załadowaną bibliotekę należy
zdobyć sam adres IP. Umieść więc w sekcji "Implementation"
taką procedurę:
procedure GetIPAndName(var IPAddress : PChar; var ACompName: PCHar);
To jest oczywiście tylko nagłówek, który zawiera dwa
parametry. Pierwszym jest zmienna, która zawierać będzie sam adres IP.
Drugi parametr to nazwa komputera. Całość procedury wyglądać będzie
tak:
procedure GetIPAndName(var IPAddress : PChar; var ACompName : PCHar);
var
Host : PHostEnt;
CompName : array[0..MAX_PATH] of char; // Nazwa zalogowanego uzytkownika
IP : PChar; // adres IP komputera
begin
//Pobieramy nazwę komputera i przypisujemy ja zmiennej "CompName"
GetHostName(@CompName, MAX_PATH);
Host := GetHostByName(@CompName); // uzyskanie nazway uzytkownika
ACompName := Host^.h_name;//przypisanie zmiennej "ACompName" nazwy użytkownika
//Pobieramy jego adres IP ( urzyte tu zostalo rzutowanie )
IP := iNet_ntoa(PInAddr(Host^.h_addr_list^)^);
IPAddress := IP; // przypisanie zmiennej "IPAddress" nazwy IP
end;
Tak jak mówiłem nie jest to proste. Zmienna "Host"
zawiera wskazanie na wskaĽnik, która zawiera właśnie informacje o
adresie IP.
Na początek określana jest długość nazwy komputera, póĽniej te
informacje zostają przypisane do zmiennej "Host".
Następnie do zmiennej "ACompName" przypisana zostaje nazwa
komputera.
PóĽniej do zmiennej "IP" przypisywany zostaje adres IP.
Ok - to już mamy - teraz odpowiednie wykorzystanie tej procedury:
procedure TMainForm.btnGetIPNameClick(Sender: TObject);
var
IP : PChar;
CName : PCHar;
TF : TextFile; // plik tekstowy
begin
{
Wykonaj procedure i przypisz jej parametry dwom zmiennym: IP oraz CName
}
GetIPandName(IP, CName);
AssignFile(TF, 'C:IP.txt'); // skojarz zmienna z nazwa tworzonego pliku
try
Rewrite(TF); // zapisz plik na dysku
Writeln(TF, 'Adres IP: ' + IP); // zapisz do pliku linie
Writeln(TF, 'Nazwa użytkownika: ' + CName);
finally
CloseFile(TF); // zakończ zapisywanie do pliku
end;
end;
W tej procedurze wykonywana zostaje sama procedura, a wynik jej wywołania
zostaje zapisywany do pliku tekstowego.
Cały listing wygląda tak:
(****************************************************************)
(* *)
(* Example programme geting IP address for Delphi 5 *)
(* Copyright (c) 2001 by Service for programmers *)
(* Adam Boduch - Build: 18.03.2001 *)
(* HTTP://WWW.PROGRAMOWANIE.OF.PL *)
(* E - mail: boduch@poland.com *)
(* *)
(****************************************************************)
unit MainFrm;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TMainForm = class(TForm)
btnGetIPName: TButton;
procedure btnGetIPNameClick(Sender: TObject);
end;
var
MainForm: TMainForm;
implementation
{$R *.DFM}
uses WinSock; // <-- wazny modul umozliwiajacy pobieranie adresu IP
procedure GetIPAndName(var IPAddress : PChar; var ACompName : PCHar);
var
Host : PHostEnt;
CompName : array[0..MAX_PATH] of char; // Nazwa zalogowanego uzytkownika
IP : PChar; // adres IP komputera
begin
//Pobieramy nazwę komputera i przypisujemy ja zmiennej "CompName"
GetHostName(@CompName, MAX_PATH);
Host := GetHostByName(@CompName); // uzyskanie nazway uzytkownika
//przypisanie zmiennej "ACompName" nazwy uzytkownika
ACompName := Host^.h_name;
//Pobieramy jego adres IP ( urzyte tu zostalo rzutowanie )
IP := iNet_ntoa(PInAddr(Host^.h_addr_list^)^);
IPAddress := IP; // przypisanie zmiennej "IPAddress" nazwy IP
end;
procedure TMainForm.btnGetIPNameClick(Sender: TObject);
var
IP : PChar;
CName : PCHar;
TF : TextFile; // plik tekstowy
begin
{
Wykonaj procedure i przypisz jej parametry dwom zmiennym: IP oraz CName
}
GetIPandName(IP, CName);
AssignFile(TF, 'C:IP.txt'); // skojarz zmienna z nazwa tworzonego pliku
try
Rewrite(TF); // zapisz plik na dysku
Writeln(TF, 'Adres IP: ' + IP); // zapisz do pliku linie
Writeln(TF, 'Nazwa użytkownika: ' + CName);
finally
CloseFile(TF); // zakoncz zapisywanie do pliku
end;
end;
var
VER : WORD;
Data : TWSAData;
initialization
begin
//Ładujemy bibliotekę Winsock
VER := MAKEWORD(1, 0);
WSAStartup(VER, Data);
end;
finalization
WSACleanup; // zwolnij biblioteke Winsock
end.
Pytanko mam choc tyko uce sie delfi ale czemu wyskakuje tak Error gdy urochamiam "Error in module Unit1:Declaration of clss Tform1 is missing or incorrect." odpowedzcie prose
No dobra ale w Delphi NET nie ma wskaźników i co wtedy??
W urzyte !ort
Oj.. a jak komputer ma 2 karty sieciowe to co ? :/
No spoko ale mam male pytanko dopiero sie ucze Delphi ale co do tego ip mam karte LAN i mam Tuner cyfrowy i mi pokazuje ip tunera ... :/
Żeby pobrać adres IP i nazwę lokalnego hosta wystarczy użyć komponentu INDY IdIPWatch. Po co ta cała gimnastyka ? :(
IdIPWatch1.LocalIP
IdIPWatch1.LocalName
no fajnie ale ja bym potrzebował pobrac IP z adresu mac nie koniecznie lokalnego kompa
Dobrze ale jak załadować IP wszystkich użytkowników sieci lokalnej.
super. czegos takiego wlasnie potrzebowałem