Laden...

Hostname auflösen mit Timeout?

Erstellt von olimlad vor 13 Jahren Letzter Beitrag vor 13 Jahren 2.491 Views
O
olimlad Themenstarter:in
106 Beiträge seit 2004
vor 13 Jahren
Hostname auflösen mit Timeout?

Hallo,

gibt es eine Möglichkeit herauszufinden, ob ein Hostname in einem Netzwerk existiert und dabei ein timeout limit zu setzen? Meine Anforderung ist, so schnell wie Möglich zu prüfen, ob ein Server existiert und ob er Antwortet.

Bei der folgenden Abfrage muss ich bis zu 30 Sekunden warten bis ich eine Antwort erhalte.


IPAddress[] IPs = Dns.GetHostAddresses(machine);

Jemand eine Idee?

Danke!

29 Beiträge seit 2009
vor 13 Jahren

Hi!

Könntest die Anfrage in einem separaten Thread laufen lassen. Mach dir zusätzlich noch ein Flag, dass du vom neuen Thread aus füllst, wenn die Anfrage erfolgreich war.

Jetzt brauchst nur noch n Timer dem du einen von dir gewählten Timeout übergibst. Wenn der Timer abgelaufen ist und dein Flag ist noch nicht gefüllt brichst du den Thread ab und fertig.

Gruß dev

C
401 Beiträge seit 2007
vor 13 Jahren

Hi,

Threads sind hier absolut unnötig. Erstmal wäre es mit Kanonen auf Spatzen geschossen, und zweitens sollte man niemals einen Thread abbrechen, sondern immer sauber auslaufen lassen. Schau dir einfach mal die asynchronen Aufrufe der Dns Klasse an, z.B. Dns.BeginGetHostAddresses

Gruß

Dario

29 Beiträge seit 2009
vor 13 Jahren

Schau dir einfach mal die asynchronen Aufrufe der Dns Klasse an, z.B. Dns.BeginGetHostAddresses

Das löst aber das Problem nicht, dass er den Timeout nicht selbst festlegen kann.

Da du aber Recht hast, dass man Threads nicht unbedingt abbrechen sollte wäre es in diesem Fall besser den Thread einfach zu ende laufen zu lassen. Durch den Timer hat er ja trotzdem nach seinem Timeout ein Ergebnis. Entweder das Flag ist gesetzt oder eben nicht.

Im Übrigen ist der Einsatz eines Threads überhaupt nicht aufwendig wenn man auf die Möglichkeit des Abbrechen verzichtet: ThreadPool

Gruß dev

3.971 Beiträge seit 2006
vor 13 Jahren

Hallo DeViL666.on,
bitte befass dich erstmal mit den Möglichkeiten und Einschränkungen des .NET Frameworks sowie des Threadings unter Windows und .NET.

Du brauchst nämlich in diesem Beispiel keinen Thread und keinen Threadpool. Das gibts bereits nahezu alles fasst fertig. Schau dir bitte folgende Links an:

Abgeborchener Thread soll nichts mehr schreiben

Asynchronous Programming Design Patterns

Hallo olimlad,
du kannst das IAsyncResult für einen Timeout verwenden.


IAsyncResult result = Dns.BeginGetHostAddresses(..., callbackFunc);
WaitHandle.AsyncWaitHandle.WaitOne(5000);

...

private void callbackFunction(IAsyncResult result ) {
  Dns.EndGetHostAddresses(result);
}

Hinweis, ohne Aufruf von EndXY bei MS Implementierungen hat deine Anwendung ein Speicherleck, daher bitte immer bei BeginXY die passende EndXY-Methode aufrufen.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

6.910 Beiträge seit 2009
vor 13 Jahren

Hallo,

ev. wäre es per Ping auch möglich. Vllt. ist das schneller.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

C
401 Beiträge seit 2007
vor 13 Jahren

Schau dir einfach mal die asynchronen Aufrufe der Dns Klasse an, z.B. Dns.BeginGetHostAddresses
Das löst aber das Problem nicht, dass er den Timeout nicht selbst festlegen kann.

Da du aber Recht hast, dass man Threads nicht unbedingt abbrechen sollte wäre es in diesem Fall besser den Thread einfach zu ende laufen zu lassen. Durch den Timer hat er ja trotzdem nach seinem Timeout ein Ergebnis. Entweder das Flag ist gesetzt oder eben nicht.

Im Übrigen ist der Einsatz eines Threads überhaupt nicht aufwendig wenn man auf die Möglichkeit des Abbrechen verzichtet:
>

Gruß dev

Löst aber das Problem, dass der Rest der Anwendung nicht weiterläuft und ich glaube das ist hier auch eher das Problem, oder? Ansonsten hat kleines_eichhoernchen ja schon eine gute Lösung gepostet.