IP adresi sorgulama
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
IP adresi sorgulama
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
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
Re: IP adresi sorgulama
Bu adreslerdeki kodlar yardımcı olabilir...
http://www.swissdelphicenter.ch/torry/s ... php?id=342
http://www.delphigeist.com/2010/03/chec ... pened.html
http://www.swissdelphicenter.ch/torry/s ... php?id=342
http://www.delphigeist.com/2010/03/chec ... pened.html
Re: IP adresi sorgulama
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
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
Re: IP adresi sorgulama
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.
Re: IP adresi sorgulama
Selam;
ş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.
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;
Re: IP adresi sorgulama
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
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
Re: IP adresi sorgulama
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.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
Re: IP adresi sorgulama
@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ı?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.
posting.php?mode=quote&f=2&p=199651#pr177752
Re: IP adresi sorgulama
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..
Re: IP adresi sorgulama
Denediğiniz ve çalışmayan kodu paylaşabilir misiniz?
Re: IP adresi sorgulama
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
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
Re: IP adresi sorgulama
Ekteki uygulamayı deneyebilirsiniz.
- Dosya ekleri
-
- ping.7z
- (1.26 KiB) 121 kere indirildi
Re: IP adresi sorgulama
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.
ç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.
Re: IP adresi sorgulama
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:
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).
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;