none
Aus der MSDN Hotline: Über Heartbeats und Sockets in .NET RRS feed

  • Allgemeine Diskussion

  • Hallo zusammen,
    heute wurde uns bei der MSDN Hotline unter anderem folgende Frage gestellt:

    Ich habe ein kleines Problem mit dem System.Net.Sockets.TcpClient. Ich frage mit meinem Script verschiedene Ports alle 5 Sekunden ab, aber scheinbar wird diese Verbindung nicht geschlossen. Der Server meldet dann nach kurzer Zeit Überlastung („stress”). Was läuft hier schief?

    Unsere Antwort bzw. unser Lösungsvorschlag darauf war:

    Wenn Sie alle 5 Sekunden einen Socket öffnen und diesen danach nicht schließen, kann der Server ab einer bestimmten Anzahl keine Verbindungen mehr annehmen. Man muss die Anzahl der gleichzeitigen Verbindungen reduzieren.
    Sie haben da zwei prinzipielle Ansätze:

    1. Sie lassen die TCP-Verbindung einfach geöffnet (ein TCP timeout dauert deutlich länger als 5 Sekunden, abhänbgig von der Implementierung bis zu mehreren Stunden) und sparen sich es, die Verbindung abzubauen.
    2. Sie stellen sicher, dass die Verbindung korrekt abgebaut wird. Der TcpClient unterstützt das nicht, sondern Sie müssten stattdessen einen System.Net.Sockets.Socket verwenden. Die Anweisung "using" hilft Ihnen, den nicht mehr benötigten Socket nach Verwendung wieder zu entfernen. Davon raten wir jedoch ab. TCP-Sockets sind nicht für fünf-Sekunden-Intervalle ausgelegt. Das würde zwar theoretisch funktionieren, in der Praxis verwenden Sie den .NET-Socket so nicht effizient.
    Implementieren Sie stattdessen den ersten Ansatz. Beispielsweise so:
    1. Legen Sie im Programm eine Liste mit Sockets oder TcpClients an und verbinden Sie diese mit dem gewünschten Port.
    2. Setzen Sie bei den TcpClients den SendTimeout auf 5 Sekunden.
    3. Senden Sie Ihre Testpakete.
    4. Warten Sie auf eine SocketException und lesen Sie dort ggf. den ErrorCode. Die Codes sind hier dokumentiert.
    5. Wenn bei (3.) eine Exception auftrat, reagiert der Rechner auf diesem Port nicht mehr.
    Damit sollte sich zumindest das Problem mit dem überlasteten Server lösen lassen. Noch ein paar letzte Anmerkungen:
    • 5 Sekunden sind etwas kurz für so einen Timeout. Je nach Anwendung genügen 30 Sekunden bis 30 Minuten.
    • Eigentlich implementiert man so etwas eher in UDP: Beispiel „Heartbeat auf Codeproject”.

     

    Wir hoffen, vielen Besuchern der MSDN Foren durch das Posten dieses Problems und einer möglichen Lösung weiterhelfen zu können.

    Viele Grüße,
    Jonathan Best
    MSDN Hotline für MSDN Online Deutschland

    Disclaimer:
    Bitte haben Sie Verständnis dafür, dass wir hier auf Rückfragen gar nicht oder nur sehr zeitverzögert antworten können.
    Bitte nutzen Sie für Rückfragen oder neue Fragen den telefonischen Weg über die MSDN Hotline: http://www.msdn-online.de/Hotline
    MSDN Hotline: Schnelle & kompetente Hilfe für Entwickler: kostenfrei!

    Es gelten für die MSDN Hotline und dieses Posting diese Nutzungsbedingungen, Hinweise zu Markenzeichen Informationen zur Datensicherheit sowie die gesonderten Nutzungsbedingungen für die MSDN Hotline.

    Freitag, 15. April 2011 15:00