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.

9 komentarzy

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??

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