In der Ausgabe 11/2013 der dotnetpro habe ich einen größeren Artikel zum Thema Sockets mit C# veröffentlicht. Dieser drehte sich um die verschiedenen Möglichkeiten eine Socket-Verbindung zu implementieren. Neben einem Vergleich der verschiedenen Strategien wird deutlich, dass Sockets auch immer noch eine gute Wahl für Client-Server-Verbindungen sein können und damit noch lange nicht zum alten Eisen gehört. Insbesondere wenn Legacy-Anwendungen angesprochen werden sollen.
Nun habe ich vor einiger Zeit eine Anfrage von einem Leser bekommen, die ich gerne mit diesem Beitrag zusammenfassen möchte. Beantwortet hatte ich sie schon zuvor per E-Mail.
Daten manipulieren
Zum einen ging es darum, wie die vom Client empfangenen Daten im High-Performance-Servers manipuliert werden können, bevor ebendiese wieder zurück zum Client geschickt werden. Das habe ich bei den anderen Implementierungen im Artikel gezeigt, bei der High-Performance Variante aber leider vergessen. Das folgende Gist zeigt den notwendigen C# Code.
[gist id=8804272 file=ProcessReceive.cs]
Der Code zeigt nichts wirklich Besonderes. Die Daten können einfach aus dem Puffer gelesen werden. Durch die beiden Eigenschaften Offset
und BytesTransferred
auch immer genau so viel, wie gerade empfangen wurde. Beim Rest handelt es sich lediglich um die Transformation von UTF8 zu einem Byte-Array und wieder zurück. Nichts Außergewöhnliches also.
Zeitgesteuertes Senden
Die zweite Frage zielte darauf ab, ob es mit dem High-Performance-Server möglich ist, nach einem beliebigen Zeitintervall eine Nachricht an einen beliebigen Client zu verschicken. Nach meiner Meinung – und der des Lesers – geht das leider nicht. Eine Anfrage des Lesers in den MSDN-Foren ging auch in die Richtung, dass das Vorhaben mit der High-Performance Variante nicht umzusetzen ist. Mir ist keine Möglichkeit bekannt, wie ich an eine Socket-Instanz gelangen kann, die ja wiederum einen speziellen Client repräsentiert. Diese Instanz wird beim Empfangen von Daten durch den Server in einer speziellen Collection gespeichert um von dort wieder auf sie zugreifen zu können. Eine Besonderheit für den High-Performance ist aber, dass die dort gespeicherten Instanzen nur temporär ein Client-Socket speichern. Dadurch sollen Ressourcen freigegeben werden, da die Daten-Objekte immer wieder aufs Neue verwendet werden können.
Falls doch jemanden eine Lösung kennt, freue ich mich über Feedback :). In diesem Fall wurde dann die Implementierung auf das APM-Modell umgestellt.
Schreibe einen Kommentar