Dienste programmieren mit .NET

Implementierung des Dienstes

Jetzt geht es noch um die eigentliche Aufgabe des Threads. Unser Beispiel implementiert dabei eine kleine Remote-Shell - allerdings ohne echte Shell-Funktionalität: Man kann zwar Kommandos an die Shell senden, diese sendet jedoch immer nur das gleiche Echo zurück. Die tatsächliche Shell-Funktionalität können Sie aber leicht hinzufügen.

Die Kommunikation findet ganz einfach mit Hilfe der TcpClient-Klasse aus .NET statt:

Int32 port = 6000;
IPAddress localAddr = IPAddress.Parse("127.0.0.1");
TcpListener server = new TcpListener(localAddr, port);
server.Start();
Byte[] bytes = new Byte[256];
String data = null;
while(true)
{
TcpClient client = server.AcceptTcpClient();
data = null;
NetworkStream stream = client.GetStream();
Int32 i;
i = stream.Read(bytes, 0, bytes.Length);
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
data = "Kommando erhalten";
Byte[] msg = System.Text.Encoding.ASCII.GetBytes( data);
stream.Write(msg, 0, msg.Length);
client.Close();
}

Im Wesentlichen besteht der Thread aus einer Schleife, in der er auf die Verbindungsaufnahme durch einen TCP-Client wartet, diese abarbeitet und beantwortet. Dabei muss man beachten, dass diese Art der Kommunikation noch nicht wirklich ausreichend ist: Sobald Daten anliegen, werden diese auch gelesen. Wenn Sie also mit dem Dienst per Telnet Verbindung aufnehmen, bekommen Sie Probleme beim Tippen. Schon die ersten Zeichen werden sofort als Kommando interpretiert - komplette Kommandos können Sie gar nicht eingeben.

Um das zu verbessern, müssten Sie das Beispiel noch erweitern. Dazu könnten Sie sich zum Beispiel ein bestimmtes Kommando-Trennzeichen einfallen lassen: Erst nach Erhalt dieses Zeichens arbeitet der Dienst das Kommando ab. Dazu müssten so lange Daten eingelesen werden, bis das "Kommando-Ende"-Zeichen eingeht. Im Beispiel wird das aber nicht getan.