Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Hostname auflösen mit Timeout?
olimlad
myCSharp.de - Member



Dabei seit:
Beiträge: 106

Themenstarter:

Hostname auflösen mit Timeout?

beantworten | zitieren | melden

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!
private Nachricht | Beiträge des Benutzers
DeViL666.on
myCSharp.de - Member

Avatar #avatar-3201.jpg


Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 416

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Corpsegrinder am .
private Nachricht | Beiträge des Benutzers
DeViL666.on
myCSharp.de - Member

Avatar #avatar-3201.jpg


Dabei seit:
Beiträge: 29

beantworten | zitieren | melden

Zitat
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
private Nachricht | Beiträge des Benutzers
kleines_eichhoernchen
myCSharp.de - Member

Avatar #avatar-2079.jpg


Dabei seit:
Beiträge: 4055
Herkunft: Ursprünglich Vogtland, jetzt Much

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers
gfoidl
myCSharp.de - Team

Avatar #avatar-2894.jpg


Dabei seit:
Beiträge: 7581
Herkunft: Waidring

beantworten | zitieren | melden

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!"
private Nachricht | Beiträge des Benutzers
Corpsegrinder
myCSharp.de - Member



Dabei seit:
Beiträge: 416

beantworten | zitieren | melden

Zitat von DeViL666.on
Zitat
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

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.
private Nachricht | Beiträge des Benutzers