Fragensteller
Async Server Timeout

Frage
-
Hallo Leute,
ich habe einen asynchronen Server programmiert.Dieser Server wird mittels ".BeginAccept" gestartet und startet im AcceptCallback mittels ".BeginReceive" den Empfang.
Im ReadCallBack werden die Zeichen, die der Client sendet, empfangen und das .BeginReceive immer wieder gestartet bis die Zeichenfolge für EOF eintrifft und der Server die Verbindung wieder schließt.
Kurzversion: Client öffnet die Verbindung zum Server sendet eine kleine Datenmenge mit anschließenden EOF -> Der Server empfängt die Daten, liest das EOF schickt eine Antwort zum Client und schließt die Verbindung.
Das ist eigentlich die klassische Vorgangsweise und das funktioniert auch so wie es soll.
Jetzt mein Problem.
Es kann aus irgendwelchen Gründen (zB. Client hängt sich auf) dazu kommen, dass der Client die Verbindung zum Server öffnet und auch Zeichen dorthin sendet, jedoch die EOF-Zeichenfolge nicht mehr sendet. Dann bleibt die Verbindung dauerhaft geöffnet was ich vermeiden möchte.
In so einer Situation (wenn EOF nicht ankommt) sollte der Server nach einer bestimmten Timeoutzeit die Verbindung selbstständig schließen.
Wie kann ich das machen?Vielen Dank im Voraus
Christian Tauschek
Alle Antworten
-
Hi Christian,
welchen Socket nutzt Du den und kannst Du an diesen Socket auch eine CancellationToken Struct (System.Threading) | Microsoft Learn übergeben?
Wenn ja dann könnten man einen CancellationToken erstellen der einen festen Timeout hat:
CancellationTokenSource Constructor (System.Threading) | Microsoft Learn
Gruß Thomas
Der Junior lernt täglich, um Senior zu werden.
Der Senior lernt täglich, da er weiß, dass er immer Junior bleiben wird.
Github -
Hallo Thomas,
danke für deine Antwort.
Ich verwende System.Net.Sockets.Socket. Jedoch habe ich das BeginnAccept / BeginnReceive mit dem Asynchronous Programming Model verwendet.
Hierbei kann ich den CancellationToken nicht übergeben. Zumindest habe ich diese Möglichkeit nicht gefunden.
Muss ich da eine gröbere Änderung machen oder geht es mit dem Asynchronous Programming Model auch?
mfg
ChristianChristian Tauschek
-
Hallo Christian,
für mich ist der Asynchroner Modus dieser hier und dort kann man einen Token übergeben:
Socket Klasse (System.Net.Sockets) | Microsoft Learn
Ich persönlich nutze nur noch den WebSocket. Dieser arbeitet über Port 80 oder 443. Zudem kann man damit einfach Nachrichten übersenden und muss sich kein Protokoll ausdenken.
WebSockets-Unterstützung in ASP.NET Core | Microsoft Learn
Gruß Thomas
Der Junior lernt täglich, um Senior zu werden.
Der Senior lernt täglich, da er weiß, dass er immer Junior bleiben wird.
Github