Konuyu Oyla:
  • Derecelendirme: 4/5 - 1 oy
  • 1
  • 2
  • 3
  • 4
  • 5
IP Adres Aralığı Hesaplama
#1
Merhaba Arkadaşlar,

Kendi işlerimde kullanmak üzere bir uygulama hazırlıyorum. Uygulama Benim belirlediğim Portta göre Networkte ilgili Hostu aramakta ve bulduklarını listelemektedir.

Örneğin Verdiğim IP aralığında 8000 Portu açık Hostları bulmak istiyorum. (Örnek 8000 portunu kullanan IP Kameraları)

Takıldığım Yer verilen 2 IP adresi arasındaki IP leri Listelemek.

Gerekli Hata kontrollerini yapıyorum.

Başlangıç : 192.168.1.10
Bitiş        : 192.168.2.100

verdiğimde arasındaki IP adreslerini Listboxa sıralamak istiyorum ? Yol gösterirseniz sevinirim.
Hobiciyim...

Cehalet Mutluluktur !! Sokrates
Cevapla
#2
İki adresi 4'er sayıya ayırıp iç içe 4 adet for döngüsü yapman lazım.
Fakat büyüklük sırası karışır ve kümenin tamamını kapsayamaz.

Bu yüzden en güzeli ip adresini 255 tabanında integer sayıya çevirip tekli for kullan.
Her aşamada integeri 1 artırıp tekrar ip'ye çevir.


function Ip2Int(i1,i2,i3,i4:byte):integer;
begin
  result := (i1 shl 24) + (i2 shl 16) + (i3 shl 8) + (i4);
end;

function Int2Ip(ip:integer):string;
var
  dizi:array[1..4] of byte absolute ip;
begin
  result := dizi[4].ToString + '.' + dizi[3].ToString + '.' + dizi[2].ToString + '.' + dizi[1].ToString;
end;
Cevapla
#3
Hocam yol gösterin dedim siz masallah yemegi yapıp pişirip sunmuşsunuz (:

Tesekkurler herşey icin.
Hobiciyim...

Cehalet Mutluluktur !! Sokrates
Cevapla
#4
(01-09-2018, Saat: 09:12)ssahinoglu Adlı Kullanıcıdan Alıntı: İki adresi 4'er sayıya ayırıp iç içe 4 adet for döngüsü yapman lazım.
Fakat büyüklük sırası karışır ve kümenin tamamını kapsayamaz.

Bu yüzden en güzeli ip adresini 255 tabanında integer sayıya çevirip tekli for kullan.
Her aşamada integeri 1 artırıp tekrar ip'ye çevir.


function Ip2Int(i1,i2,i3,i4:byte):integer;
begin
  result := (i1 shl 24) + (i2 shl 16) + (i3 shl 8) + (i4);
end;

function Int2Ip(ip:integer):string;
var
  dizi:array[1..4] of byte absolute ip;
begin
  result := dizi[4].ToString + '.' + dizi[3].ToString + '.' + dizi[2].ToString + '.' + dizi[1].ToString;
end;

Başardım. Gayet güzel Çalışıyor. Dediğiniz gibi Tek Döngü ile hallettim.

 type
  IPv4 = record
   Octet: array [1..4] of Byte ;
 end;  

 const
 LISTESIRA     = 0;
 LISTEIP       = 1;
 LISTEMAC      = 2;
 LISTEPROTOKOL = 3;
 LISTEPORT     = 4;

 OKTET1  = 1;
 OKTET2  = 2;
 OKTET3  = 3;
 OKTET4  = 4; 

var

 BaslangicIP : IPv4;
 BitisIP     : IPv4;

function Ip2Int(i1,i2,i3,i4:byte):integer;
begin
 result := (i1 shl 24) + (i2 shl 16) + (i3 shl 8) + (i4);
end;

function Int2Ip(ip:integer):string;
var
 dizi:array[1..4] of byte absolute ip;
begin

 if ((Dizi[4] = 0) or (Dizi[4] = 255)  or
     (Dizi[3] = 0) or (Dizi[3] = 255)  or
     (Dizi[2] = 0) or (Dizi[2] = 255)  or
     (Dizi[1] = 0) or (Dizi[1] = 255)) then
 begin
   result := '' ;
 end
  else
 begin
 result := dizi[4].ToString + '.' +
           dizi[3].ToString + '.' +
           dizi[2].ToString + '.' +
           dizi[1].ToString;

 end;
end;        

procedure ListeEkle(var Liste:TStringGrid;pip,pmac,pprotokol,pport:string);
var
 eklenensatir : integer;
begin
 Liste.RowCount := Liste.RowCount + 1;
 eklenensatir := Liste.RowCount-1;

 Liste.Cells[LISTESIRA,eklenensatir]     := inttostr(eklenensatir);
 Liste.Cells[LISTEIP,eklenensatir]       := trim(pip);
 Liste.Cells[LISTEMAC,eklenensatir]      := trim(pmac);
 Liste.Cells[LISTEPROTOKOL,eklenensatir] := trim(pprotokol);
 Liste.Cells[LISTEPORT,eklenensatir]     := trim(pport);
 Liste.Row := eklenensatir;

end;

procedure IPListOlustur(var Baslama,bitis:IPv4;var Liste:TStringGrid);
var
IPilk  : integer;
IPSon  : integer;
sira   : integer;
IPADDR : String;
 begin

 IPilk := Ip2Int(Baslama.Octet[Oktet1],Baslama.Octet[Oktet2],
                 Baslama.Octet[Oktet3],Baslama.Octet[Oktet4]);

 IPSon := Ip2Int(Bitis.Octet[Oktet1],Bitis.Octet[Oktet2],
                 Bitis.Octet[Oktet3],Bitis.Octet[Oktet4]);

 for sira := IPilk to IPSon do
  begin
    IPADDR := Int2Ip(sira);
    if (IPADDR <> '') then
     ListeEkle(Liste,IPADDR,'','','');
     Application.ProcessMessages;
  end;

end;   


IPListOlustur(BaslangicIP,BitisIP,IPList); 
Hobiciyim...

Cehalet Mutluluktur !! Sokrates
Cevapla
#5
Aslında tüm ip adresleri tam 0-255 arasında olmuyor ama kendin için pratikte böyle kullanabilirsin.

İleride daha doğru adresleme yapmak istersen aralıkları "Subnet Mask" değerine göre kısıtlaman gerekir.

Yani aralıktan elde ettiğin adreslerin bir kısmının ağında atayamayacağın adresler olması mümkündür.
Cevapla
#6
(01-09-2018, Saat: 12:08)ssahinoglu Adlı Kullanıcıdan Alıntı: Aslında tüm ip adresleri tam 0-255 arasında olmuyor ama kendin için pratikte böyle kullanabilirsin.

İleride daha doğru adresleme yapmak istersen aralıkları "Subnet Mask" değerine göre kısıtlaman gerekir.

Yani aralıktan elde ettiğin adreslerin bir kısmının ağında atayamayacağın adresler olması mümkündür.

Bana şuanda Oktetlerde 0 ve 255 olmasın işimi çözüyor.

Aktif Ethernet kartının ip adresini ve subnet mask adresini alamadım. nette örnek bulduğumda tüm kartlarınkini alıyor. ayıklamak zor geldi açıkçası.

şuan için başlangıç ve bitiş ip adresini kendim girip tarama yapıyorum.
Hobiciyim...

Cehalet Mutluluktur !! Sokrates
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Resmi Tatil Hesaplama bydelphi 3 726 09-11-2022, Saat: 12:03
Son Yorum: bydelphi
  Dakika farkı hesaplama varyemez 1 629 05-05-2022, Saat: 09:57
Son Yorum: RAD Coder
  Tarih Farkı Hesaplama OZCANK 12 3.259 18-11-2021, Saat: 09:32
Son Yorum: COMMANDX
  TIdFtp Toplam Kullanılan Alan Hesaplama Hakkında Yardım glagher 7 1.624 07-11-2021, Saat: 16:02
Son Yorum: mrmarman
  fastreport kdv hesaplama erdogan 1 1.150 30-10-2020, Saat: 11:22
Son Yorum: csunguray



Konuyu Okuyanlar: 1 Ziyaretçi