IP adresi sorgulama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
tolgaozb
Üye
Mesajlar: 70
Kayıt: 26 Ara 2003 12:22
Konum: Karşıyaka
İletişim:

IP adresi sorgulama

Mesaj gönderen tolgaozb »

Merhabalar

Bu konu forumda daha önce mutlaka geçmiştir fakat tüm aramalarıma rağmen bulamadım.

Yazılımım birden çok IP tabanlı cihaza 4370 portundan bağlanarak bir takım işler yapıyor.
Bu işlem sürekli (7/24) olmakta.Eğer bağlantıda bir sorun var ise bunu yazılımın fark etmesi neredeyse 30 -40 saniyeyi buluyor
ve bu sürede tüm işlemler kitleniyor yazılım Not responding durumuna düşüyor.
Kısacası hızlı bir şekilde bir IP adresinin var olup olmadığını port belirterek ya da belirtmeyerek anlayabileceğim bir yönteme ihtiyacım var.
IP adresi var mı yok mu ? Erişebilir midir ? 2-3 saniye içinde nasıl anlayabilirim .

Teşekkürler
İyi çalışmalar
T.Tolga Özbaltalar - http://www.veridizayn.com
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: IP adresi sorgulama

Mesaj gönderen Battosai »

Kullanıcı avatarı
G.Arkas
Üye
Mesajlar: 829
Kayıt: 01 Eki 2007 07:16
Konum: İstanbul
İletişim:

Re: IP adresi sorgulama

Mesaj gönderen G.Arkas »

Ping atabilirsiniz.
Resim
Kullanıcı avatarı
tolgaozb
Üye
Mesajlar: 70
Kayıt: 26 Ara 2003 12:22
Konum: Karşıyaka
İletişim:

Re: IP adresi sorgulama

Mesaj gönderen tolgaozb »

Selamlar

Battosai - ilk kodu çalıştıramadım aşağıdaki satırda hata veriyor.
İkinci kodda ise eğer IP erişilemez ise 25 sn kadar sonra erişilemez olduğu bilgisi dönüyor bu süre zarfında da program kitleniyor.Esas aşmak istediğim durum da tam bu.
Eğer erişilmez is bunu hızlıca 2-3 sn kadar bulmam gerek.

if WSASetBlockingHook(@BlockingHookProc) = nil then
begin
if PError <> nil then SaveError('WSASetBlockingHook', WSAGetLastError);
Exit;
end;


G.Arkas - Ping attığımda üstteki durum gibi eğer erişilmez ise cevap süresi yaklaşık 30 sn ve bu süre içinde kitlenme oluyor.


Teşekkürler
T.Tolga Özbaltalar - http://www.veridizayn.com
Kullanıcı avatarı
Battosai
Üye
Mesajlar: 1316
Kayıt: 01 Eki 2007 12:02
Konum: Ankara

Re: IP adresi sorgulama

Mesaj gönderen Battosai »

25sn lik süre isteğin timeout süresidir. WinSock nasıl çalışıyor bilmiyorum isteğin timeout süresini kısaltabilirseniz sonuca ulaşırsınız sanırım. İsterseniz idHttp ile ping gönderin idHttp'nin timeout ayarları var.
Kullanıcı avatarı
esistem
Üye
Mesajlar: 464
Kayıt: 02 Eki 2007 11:22
İletişim:

Re: IP adresi sorgulama

Mesaj gönderen esistem »

Selam;

Kod: Tümünü seç

uses IdIcmpClient;
{$R *.dfm}

function TForm1.Ping(const AHost : string) : Boolean;
var
  MyIdIcmpClient : TIdIcmpClient;
begin
  Result := True;

  MyIdIcmpClient := TIdIcmpClient.Create(self);
  MyIdIcmpClient.ReceiveTimeout := 100;
  MyIdIcmpClient.Host := AHost;
  MyIdIcmpClient.BufferSize := 8192;
  MyIdIcmpClient.Protocol := 1;
  try
    MyIdIcmpClient.Ping;
  except
    Result := False;
    Exit;
  end;
  if MyIdIcmpClient.ReplyStatus.ReplyStatusType <> rsEcho Then result := False;
  MyIdIcmpClient.Free;
end;
şu ko sanırım işinizi görür, fakat timeout süreniz ne olursa olsun, eğer ping atmak istediğiniz ip var ise program mecburen karşı taraftan bilgi gelene bekleyecektir, ping atmak istediğiniz ip eğer yavaş ise dönüşünü mecburen bekler. Kısaca bu tip durumlarda TimeOut işe yaramaz.
Kullanıcı avatarı
tolgaozb
Üye
Mesajlar: 70
Kayıt: 26 Ara 2003 12:22
Konum: Karşıyaka
İletişim:

Re: IP adresi sorgulama

Mesaj gönderen tolgaozb »

Selamlar

Daha önce kullandığım ping unit i internet araştırmam sırasında bulup program eklemiştim ve bahsettiğim geç geri dönüş durumunu yaşamıştım.
Timeout gibi herhangi bir parametre de almıyordu.Şimdi yeniden konuyu google'da araştırdığımda aşağıdaki adresteki ping uygulamasının
parametre aldığını ve örneğin 250-300 gibi bir parametre ile çok daha hızlı (1,2 sn de) herhangi bir kitlenme olmadan geri dönüş sağladığını görüyorum.
Dolayısı ile bu şekilde sorunu çözdüm diyebilirim .

İlgili link :
http://stackoverflow.com/questions/1906 ... g-delphi-5
T.Tolga Özbaltalar - http://www.veridizayn.com
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: IP adresi sorgulama

Mesaj gönderen Bay_Y »

tolgaozb yazdı: 26 Ağu 2014 09:33 Selamlar

Daha önce kullandığım ping unit i internet araştırmam sırasında bulup program eklemiştim ve bahsettiğim geç geri dönüş durumunu yaşamıştım.
Timeout gibi herhangi bir parametre de almıyordu.Şimdi yeniden konuyu google'da araştırdığımda aşağıdaki adresteki ping uygulamasının
parametre aldığını ve örneğin 250-300 gibi bir parametre ile çok daha hızlı (1,2 sn de) herhangi bir kitlenme olmadan geri dönüş sağladığını görüyorum.
Dolayısı ile bu şekilde sorunu çözdüm diyebilirim .

İlgili link :
http://stackoverflow.com/questions/1906 ... g-delphi-5
merhabalar linkini verdiğiniz sayfadaki function ile ping attığımda olan ip adresine yok diyor , çalışan kod sizde mi acaba küçük bir kod gönderebilir misiniz? ip kontrolü yapabileceğim farklı bir fonksiyonda olabilir , internetten buldum aslında ama hata da vermiyor fakat hep "false" geri dönüyor.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: IP adresi sorgulama

Mesaj gönderen ertank »

Bay_Y yazdı: 08 Ara 2017 03:40 merhabalar linkini verdiğiniz sayfadaki function ile ping attığımda olan ip adresine yok diyor , çalışan kod sizde mi acaba küçük bir kod gönderebilir misiniz? ip kontrolü yapabileceğim farklı bir fonksiyonda olabilir , internetten buldum aslında ama hata da vermiyor fakat hep "false" geri dönüyor.
@esistem'in 25 Ağu 2014 04:15 tarihindeki mesajı ile Delphi ile nasıl yapabileceğinizin örnek kodu paylaşılmış. Bu kod ile deneme yaptınız mı?
posting.php?mode=quote&f=2&p=199651#pr177752
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: IP adresi sorgulama

Mesaj gönderen Bay_Y »

en son başarılı olduğunu söylediği kod ile deneme yaptım fakat dediğim gibi ne yazarsam yazayım hep geriye false dönüyor. Yine bu konu ile ilgili indy de farklı bir kod paylaşılmış onda da ip adresini eksik bile yazsanız geriye "true" dönüyor..
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: IP adresi sorgulama

Mesaj gönderen ertank »

Bay_Y yazdı: 08 Ara 2017 06:24 en son başarılı olduğunu söylediği kod ile deneme yaptım fakat dediğim gibi ne yazarsam yazayım hep geriye false dönüyor. Yine bu konu ile ilgili indy de farklı bir kod paylaşılmış onda da ip adresini eksik bile yazsanız geriye "true" dönüyor..
Denediğiniz ve çalışmayan kodu paylaşabilir misiniz?
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: IP adresi sorgulama

Mesaj gönderen Bay_Y »

kodu kopyala yapıştır yaptığımda hepsi sola dayalı oluyor , özür dilerim bu yüzden altta kodu da gönderdim.

unit uPing;

interface

uses
Windows,
SysUtils,
Classes;

type
TSunB = packed record
s_b1, s_b2, s_b3, s_b4: byte;
end;

TSunW = packed record
s_w1, s_w2: word;
end;

PIPAddr = ^TIPAddr;
TIPAddr = record
case integer of
0: (S_un_b: TSunB);
1: (S_un_w: TSunW);
2: (S_addr: longword);
end;

IPAddr = TIPAddr;

TIcmpCreateFile = function(): THandle; stdcall;
TIcmpCloseHandle = function(icmpHandle: THandle): boolean; stdcall;
TIcmpSendEcho = function(IcmpHandle: THandle; DestinationAddress: IPAddr; RequestData:
Pointer; RequestSize: smallint; RequestOptions: pointer; ReplyBuffer: Pointer;
ReplySize: DWORD; Timeout: DWORD): DWORD; stdcall;

const
IcmpCreateFile: TIcmpCreateFile = nil;
IcmpCloseHandle: TIcmpCloseHandle = nil;
IcmpSendEcho: TIcmpSendEcho = nil;

function Ping(InetAddress: string; iTimeout: cardinal): boolean;

implementation

uses
WinSock;

function Fetch(var AInput: string; const ADelim: string = ' ';
const ADelete: boolean = True): string;
var
iPos: integer;
begin
if ADelim = #0 then
begin
// AnsiPos does not work with #0
iPos := Pos(ADelim, AInput);
end
else
begin
iPos := Pos(ADelim, AInput);
end;
if iPos = 0 then
begin
Result := AInput;
if ADelete then
begin
AInput := '';
end;
end
else
begin
Result := Copy(AInput, 1, iPos - 1);
if ADelete then
begin
Delete(AInput, 1, iPos + Length(ADelim) - 1);
end;
end;
end;

procedure TranslateStringToTInAddr(AIP: string; var AInAddr);
var
phe: PHostEnt;
pac: PChar;
GInitData: TWSAData;
begin
WSAStartup($101, GInitData);
try
phe := GetHostByName(PChar(AIP));
if Assigned(phe) then
begin
pac := phe^.h_addr_list^;
if Assigned(pac) then
begin
with TIPAddr(AInAddr).S_un_b do
begin
s_b1 := byte(pac[0]);
s_b2 := byte(pac[1]);
s_b3 := byte(pac[2]);
s_b4 := byte(pac[3]);
end;
end
else
begin
raise Exception.Create('Error getting IP from HostName');
end;
end
else
begin
raise Exception.Create('Error getting HostName');
end;
except
FillChar(AInAddr, SizeOf(AInAddr), #0);
end;
WSACleanup;
end;

function Ping(InetAddress: string; iTimeout: cardinal): boolean;
var
hIcmpDll: HMODULE;
hIcmpFile: THandle;
InAddr: IPAddr;
DW: DWORD;
rep: array[1..128] of byte;
begin
Result := False;
{ load a library }
hIcmpDll := LoadLibrary('icmp.dll');

if (hIcmpDll = 0) then
begin
raise Exception.Create('icmp.dll library can not be loaded or not found. ' +
SysErrorMessage(GetLastError));
end;

try
{ load an address of required procedure}
@IcmpCreateFile := GetProcAddress(hIcmpDll, 'IcmpCreateFile');
@IcmpSendEcho := GetProcAddress(hIcmpDll, 'IcmpSendEcho');
@IcmpCloseHandle := GetProcAddress(hIcmpDll, 'IcmpCloseHandle');

{if procedure is found in the dll}
if Assigned(IcmpCreateFile) and Assigned(IcmpSendEcho) and Assigned(IcmpCloseHandle)
then
begin
hIcmpFile := IcmpCreateFile;
try
if hIcmpFile = INVALID_HANDLE_VALUE then
Exit;
TranslateStringToTInAddr(InetAddress, InAddr);
DW := IcmpSendEcho(hIcmpFile, InAddr, nil, 0, nil, @rep, 128, iTimeout); //0);
Result := (DW <> 0);
finally
IcmpCloseHandle(hIcmpFile);
end;
end;
finally
{unload a library}
FreeLibrary(hIcmpDll);
end;

end;

end.

procedure TForm1.Button2Click(Sender: TObject);
begin
IdIcmpClient1.Host:= Edit1.Text ;
try
IdIcmpClient1.Ping();
except
showmessage('Not found');
end;
end;


http://dosya.co/lpmsxdyx4rcl/pingip.rar.html
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: IP adresi sorgulama

Mesaj gönderen ertank »

Ekteki uygulamayı deneyebilirsiniz.
Dosya ekleri
ping.7z
(1.26 KiB) 118 kere indirildi
Bay_Y
Üye
Mesajlar: 116
Kayıt: 10 Mar 2014 11:12
Konum: İstanbul

Re: IP adresi sorgulama

Mesaj gönderen Bay_Y »

Teşekkürler Ertan Bey.

çok güzel çalışıyor , ama kızmazsanız bir sorum daha olacak , "false" değerinden önce ulaşılmama durumu için makine kasıyor , donuyor bunu engellemek için süreyi 500 ms yapsam yanlış değer döner mi ? Birkaç deneme yaptım çok sorun olmadı ama sorun olabilir mi ? Sorun olabilir derseniz bunu IdThreadComponent1 içine koysam ve kullansam bu kasma ve donma için doğru bir tercih midir?

Kolay Gelsin.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: IP adresi sorgulama

Mesaj gönderen ertank »

Yanlış değer dönme ihtimali var.

1- Uygulama donmasını engellemek adına TIdAntifreeze bileşenini form üzerine ekleyerek deneyin.
2- (1) numara işe yaramaz ise TIdAntifreeze bileşeni form üzerinde iken kodu aşağıdaki şekilde değiştirerek forma ait bir fonksiyon haline getirin ve böyle deneyin:

Kod: Tümünü seç

unit uMain;

interface

uses
  Winapi.Windows,
  Winapi.Messages,
  System.SysUtils,
  System.Variants,
  System.Classes,
  Vcl.Graphics,
  Vcl.Controls,
  Vcl.Forms,
  Vcl.Dialogs,
  Vcl.StdCtrls,
  IdBaseComponent,
  IdAntiFreezeBase,
  IdAntiFreeze;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    IdAntiFreeze1: TIdAntiFreeze;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    function Ping(const AHost: string; const TimeoutMilliseconds: Word = 100): Boolean; // EKLENECEK
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

uses
  IdIcmpClient;

function TForm1.Ping(const AHost: string; const TimeoutMilliseconds: Word = 100): Boolean; // DÜZENLENECEK
var
  IdIcmpClient : TIdIcmpClient;
begin
  if Trim(AHost) = EmptyStr then
  begin
    Result := False;
    Exit();
  end;

  IdIcmpClient := TIdIcmpClient.Create(Self); // DÜZENLENECEK
  try
    IdIcmpClient.Host := AHost;
    IdIcmpClient.ReceiveTimeout := TimeoutMilliseconds; // Milisaniye
    try
      IdIcmpClient.Ping();
    except
      Result := False;
      Exit();
    end;
    Result := IdIcmpClient.ReplyStatus.ReplyStatusType = rsEcho;
  finally
    IdIcmpClient.Free();
  end;
end;
TIdAntifreeze bileşeni donmayı tamamen yok etmez. Sadece azaltır. Şahsen genel olarak yeterli seviyelere getirdiğini gözlemledim. Eğer bu seviye sizin için yeterli olmaz ise fonksiyonu ilk hali ile bir thread içinde çalıştırmanızda fayda var. Ancak thread kullanımı sizin için daha zor olacaktır. Thread asenkron çalışacağı için hata veya başarı durumunu bilmek için geri bildirim verecek bir "TNotifyEvent" olayı kullanmanız gerekecektir. Kodunuzda cevap gelmesini beklemeyi düzenlemeniz gerekecektir (sonucu belli olmayan IP adresi bağlantı sırasında beklemeli gibi).
Cevapla