AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi Ping über Hostname mit timeout
Thema durchsuchen
Ansicht
Themen-Optionen

Ping über Hostname mit timeout

Ein Thema von renekr · begonnen am 30. Sep 2008 · letzter Beitrag vom 28. Jan 2009
Antwort Antwort
Seite 1 von 2  1 2      
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#1

Ping über Hostname mit timeout

  Alt 30. Sep 2008, 11:40
Hi,
Ich weiß das das Thema Ping hier in der DP oft behandelt wurde,doch leider habe ich für meine Anforderungen nix passendes gefunden.

Ich habe den Rechnernamen und will diesen "kurz" prüfen ob er anpingbar ist ,also im Bereich < 1s.

Und danach benötige ich die IP Adresse welche ich mit Luckies Unit raus hole.
Weil ich prüfe ob der PC in dem von mir Gültigen VLan ist.

Das geht auch schnell aber wenn ein besagter Host Offline ist dauert es mehrere Sekunden.

Gibt es da eine Möglichkeit ?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Ping über Hostname mit timeout

  Alt 30. Sep 2008, 11:50
Lager den Ping in einen Thread aus und warte auf den Thread mit MSDN-Library durchsuchenWaitForSingleObject mit der Angabe eines Timeouts auf dessen Beendigung.
Michael
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#3

Re: Ping über Hostname mit timeout

  Alt 30. Sep 2008, 11:52
Hallo,

falls Du für das Ping den IdIcmpClient von Indy nimmst, setze das Timeout runter auf 1000 statt den Defaultwert von 5000 zu lassen.

Stephan
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: Ping über Hostname mit timeout

  Alt 30. Sep 2008, 12:54
Hi,
also ich habe nun mal die Indys getestet und was festgestellt.
Wenn ich Timeout in der IDE in der Komponente einstelle auf 1000 geht es nur 1000 ms,aber wenn ich es im Code zuweise ,auch den Host macht er deutlich mehr S bis zum timeout.

Delphi-Quellcode:
IdIcmpClient1.Host:=edit2.text ;
IdIcmpClient1.ReceiveTimeout:=1000;
IdIcmpClient1.Ping();
Ist das jemand mal aufgefallen ?

PS: Hab gerade festgestellt das die Indys ja Admin Rechte benötigen,das bringt mir auch nix.

Danke.
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Ping über Hostname mit timeout

  Alt 30. Sep 2008, 12:59
Zitat von Luckie:
Lager den Ping in einen Thread aus und warte auf den Thread mit MSDN-Library durchsuchenWaitForSingleObject mit der Angabe eines Timeouts auf dessen Beendigung.
hi,
Hast du dazu ein Beispiel ?
Ich habe mit Threads usw noch keine Erfahrungen!

Danke
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#6

Re: Ping über Hostname mit timeout

  Alt 30. Sep 2008, 13:12
Wenn du keine Erfahrung hast dann leigt es an der Hand dass du weiter SELBST im Netz suchen musst. (Suchmaschine bemühen) Aus Erfahrung gesprochen wird man so am schnellsten findig.

Gesagt gemacht: ein triviales Beispiel in C++, solle aber ziemlich verständlich sein:
Code:
#include <windows.h>
#include <iostream.h>

HANDLE hEvent;

DWORD WINAPI SampleThread(LPVOID iValue)
{

    int iFinish = 120;
    for(int i=100;i<=iFinish;i++)
    cout<<i<<endl;

    SetEvent(hEvent);
    return 0;

}

void main()
{

    HANDLE hThread;
    DWORD dwGenericThread;
    hThread = CreateThread(NULL,0,SampleThread,NULL,0,&dwGenericThread);
    if(hThread == NULL)
    {

        DWORD dwError = GetLastError();
        cout<<"SCM:Error in Creating thread"<<dwError<<endl ;
        return;

    }

    hEvent = CreateEvent(NULL,FALSE,FALSE,"Test");

    cout<<"Started waiting for the thread to complete.."<<endl ;
    WaitForSingleObject(hEvent,INFINITE);
    cout<<"Thread Completed."<<endl ;

    CloseHandle(hEvent);

}
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Ping über Hostname mit timeout

  Alt 30. Sep 2008, 13:45
Warum Events verwenden? Es geht auch ohne:
Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows,
  Messages;

function MyThread(p: pOinter): Integer;
begin
  MessageBox(0, 'MessageBox in Thread', 'Thread', 0);
  Result := 0;
end;

var
  Thread: THandle;
  ThreadID: DWORD;
  WaitResult: DWORD;

begin
  Thread := BeginThread(nil, 0, @MyThread, nil, 0, ThreadID);
  WaitResult := WaitForSingleObject(Thread, 5000);
  case WaitResult of
    WAIT_OBJECT_0: Writeln('MessageBox closed by user');
    WAIT_TIMEOUT:
    begin
      SendMessage(FindWindow(nil, 'Thread'), WM_CLOSE, 0, 0);
      Writeln('Tinmeout');
    end;
  end;
  CloseHandle(Thread);
  Readln;
end.
Hier noch schnell meine C++ Version:
Code:
#include <windows.h>
#include <iostream>

using namespace std;

DWORD WINAPI ThreadProc( LPVOID lpParam )
{
   MessageBox(0, L"Messagebox in Thread", L"Thread", 0);
   return 0;
}

int wmain( int argc, wchar_t *argv[ ], wchar_t *envp[ ] )
{
   HANDLE hThread;
   DWORD dwThreadID;
   
   hThread = CreateThread(NULL, 0, ThreadProc, NULL, 0, &dwThreadID);
   if (hThread == NULL)
   {
      cout << GetLastError();
      CloseHandle(hThread);
      return 1;
   }

   DWORD dwWaitResult = WaitForSingleObject(hThread, 5000);
   switch (dwWaitResult)
   {
      case WAIT_OBJECT_0:
         cout << "MessageBox closed by user";
         break;
      case WAIT_TIMEOUT:
         SendMessage(FindWindow(NULL, L"Thread"), WM_CLOSE, 0, 0);
         cout << "Timeout";
         break;
   }   
   CloseHandle(hThread);
   return 0;
}
@sniper_w: Du schliesst das ThreadHandle nicht.
Michael
  Mit Zitat antworten Zitat
Benutzerbild von sniper_w
sniper_w

Registriert seit: 12. Dez 2004
Ort: Wien, Österriech
893 Beiträge
 
Delphi 6 Enterprise
 
#8

Re: Ping über Hostname mit timeout

  Alt 30. Sep 2008, 14:46
@Luckie: Stimmt. Ich habe das Quelltext nur überflogen, wollte aber etwas ganz anders betonen, nämlich wie man mit 2-3 Klicks sich ein Beispiel besorgen kann an dem mann weiter arbeiten kann (anpassen, testen, etc....)
Katura Haris
Es (ein gutes Wort) ist wie ein guter Baum, dessen Wurzel fest ist und dessen Zweige in den Himmel reichen.
  Mit Zitat antworten Zitat
renekr

Registriert seit: 27. Feb 2005
Ort: Karlsbad
534 Beiträge
 
Delphi 2007 Enterprise
 
#9

Re: Ping über Hostname mit timeout

  Alt 1. Okt 2008, 07:09
Hi ,
so ich habe nun etws mit thread rum getestet.
Kann es sein das wenn ich den Ping absetze und Timeout auf 2000 ms stehen habe ,aber der Ping schneller fertig ist das er trotzdem seine 2000 ms wartet ?


Danke.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Ping über Hostname mit timeout

  Alt 1. Okt 2008, 09:12
Nein. wenn du in meinem Beispielcode die Messagebox vor Ablauf der fünf Sekunden schliesst, signalisiert das Threadobjekt und WaitForSingleObjekt kehrt sofort mit dem Rückgabewert WAIT_OBJECT_0 zurück.
Michael
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz