Strona g│≤wna

 

Pobieranie adresu IP

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: 

Listing 4.1


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:

Listing 4.2


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:

Listing 4.3


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:

Listing 4.4


(****************************************************************)
(*                                                              *)
(*      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.

Przydatne linki:

  • Co to s▒ wska╝niki? [ Zobacz ]
  • Zapisywanie plik≤w [ Zobacz ]

Gotowe ╝r≤d│o mo┐esz ╢ci▒gn▒µ tutaj:

ipaddress.zip ( 2 kB )

Adam Boduch