C# TCP Socket .Net 4.7.2

Hallo allerseits

Ich möchte gerne einen TCP Socket Server machen, bei sich ein Client verbinden kann, und periodisch Daten an den Server senden kann (z.B. alle 60 Sekunden). Werden keine Daten gesendet wird eine «Alive» Message gesendet, welch der Server dann quittiert.

Ich habe nun diverse TCP Socket Client/Server Beispiele gefunden und getestet. So z.B.:

Auch die NuGet SimpleTCP habe ich versucht: https://github.com/BrandonPotter/SimpleTCP

Das Problem ist nun, dass alle Server-Beispiele die ich finden, die Verbindung mit dem Client schliessen, sobald eine Message des Clients quittiert wurde. Also z.B. mit:

  • Shutdown(SocketShutdown.Both)
  • Close()

Aber genau das will ich nicht. Der Client sendet eine Message, bevor er sich beendet z.B. «quit», erst dann soll sich die Verbindung beenden. Also so ähnlich wie in nachfolgendem C Beispiel (Verbindung beenden bei «quit» Eingabe).

http://openbook.rheinwerk-verlag.de/linux_unix_programmierung/Kap11-007.htm#bild

Als Testclient verwende ich https://sourceforge.net/projects/sockettest/. Nach Shutdown() bzw. Close() auf dem Server muss immer wieder neu verbunden werden, bevor eine neue Message gesendet werden kann.

Wie stelle ich es an, dass der Server zuhört und Anfragen quittiert, bis sich der Client verabschiedet?

Danke im Voraus und Gruss
olli

Hallo!

Mir ist nicht klar, wie du du sowas nutzen möchtest, ohne dir die Code-Beispiele genauer anzuschauen.

Das synchrone Beispiel ist am einfachsten zu verstehen. Das liest, sobald eine Verbindung geöffnet wird, so lange Daten, bis <EOF> darin auftaucht. Die Lese-Schleife wird dann beendet, die Daten zurück an den Client geschickt, und dann die Verbindung geschlossen.

Aber das lässt sich doch derart erweitern, daß innerhalb der Lese-Schleife bereits auf empfangene Daten reagiert wird.

Vielleicht solltest du dir doch mal anschauen, was ein Service eigentlich ist. Und wie und wann einer gestartet wird. Und was ein Beenden dieses Services eigentlich bedeutet. Das ist etwas mehr als das Kopieren eines fremden Quellcodes, das ist das Erlernen der Vorgänge in einem Betriebssystem. Das Verständnis für die Konzepte dahinter ist grundlegend notwendig, sonst wird das nie was gescheites.

Und über die Sicherheit mag ich hier gar nicht spekulieren, die ist unter Garantie nicht mal rudimentär vorhanden.

Hallo sweber

Danke für die Antwort!

«<… und dann die Verbindung geschlossen.>»

Genau dieses Schliessen der Verbindung soll es nicht machen.

Ich habe in der Zwischenzeit auch noch weiter recherchiert und bin auf folgendes Beispiel gestossen:

Hier wird die Verbindung nicht geschlossen mit handler.Shutdown(SocketShutdown.Both) und handler.Close() .

Mit ändern des Codes «data = System.Text.Encoding.ASCII.GetString(bytes, 0, i)» nach «data += System.Text.Encoding.ASCII.GetString(bytes, 0, i)», detektieren von und einfügen von «data = String.Empty» nach „Sent: {0}“ kann ich auch grössere Datenmengen (als 256 Byte) handhaben.

Die Clientverbindung wird hier nicht vom Server beendet, sondern entscheidet selbst, wann verbinden, wann nicht.

Beste Grüsse, Olli

Naja, das hättest du auch mit den ersten Beispielen erreichen können…

1 Like