Entwickler-Ecke
Netzwerk - TCPListener: Problem in Schleife
Xzeer - So 31.10.10 12:37
Titel: TCPListener: Problem in Schleife
Hi,
Ich habe ein Problem mit dem TCPListener.
Und zwar programmiere ich einen einfachen thread-basierten Netzwerkserver, der die Kommunikation mit mehreren Clients abwickeln kann.
Dazu habe ich eine Methode geschrieben, welche ständig auf neue Clients wartet (und natürlich in einem eigenen Thread ausgeführt wird):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34:
| private void warteAufClient() { listener.Start();
TcpClient client = new TcpClient();
while (isActive) { try { client = listener.AcceptTcpClient(); } catch { } finally { }
clients.Add(client);
Thread clientLoop = new Thread(new ParameterizedThreadStart(bearbeiteClient));
clientLoop.Start(client); } } |
Nun habe ich aber ein Problem den Server wieder zu beenden, da AcceptTCPClient() den Thread ja bis zur nächsten Verbindung anhält.
Dadurch zeigt meine Laufbedingung für die While-Schleife keine Auswirkung. Diesem Effekt mit try-catch-finally entgegenzuwirken funktioniert leider nicht.
Gibt es da eine schicke Möglichkeit?
//EDIT:
Hab es jetzt so gelöst:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| private void warteAufClient() { listener.Start();
TcpClient client = new TcpClient();
while (true) { try { client = listener.AcceptTcpClient(); } catch { break; } clients.Add(client);
Thread clientLoop = new Thread(new ParameterizedThreadStart(bearbeiteClient));
clientLoop.Start(client); } } |
Über die ServerBeenden Methode schließe ich den listener mit listener.stop(). Dabei wirft die AccptTCPCClient Methode allerdings eine Exception, die ich (unschönerweise) einfach abfange und aus der schleife springe.
Wenn jemand eine bessere Lösung hat, kann er sie gerne posten... :wink:
huuuuuh - So 31.10.10 13:19
listener.Pending() ist
true, sobald eine Verbindung anliegt.
habe es also, kurz gesagt, so gemacht:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| while (true) { while (!listener.Pending()) { if (!(IsActive)) { return; } Thread.Sleep(200); } try { client = listener.AcceptTcpClient();
clients.Add(client);
Thread clientLoop = new Thread(new ParameterizedThreadStart(bearbeiteClient));
clientLoop.Start(client); } catch { } finally { }
} |
In der
while (!listener.Pending()) -Schleife wird auf eine neue Verbindung gewartet. Alle 200ms (Die 200ms sind Variabel, sollten aber für die meisten Anwendungsfälle ausreichen) wird abgefragt, ob eine Verbindung anliegt. wenn diese da ist wird sie angenommen.
Wenn der Wert
IsActive false ist, wird die gesamte Methode abgebrochen.
Xzeer - So 31.10.10 14:22
cool, danke :zustimm:
pending war mir noch nicht bekannt...
Kha - So 31.10.10 14:27
Warum nicht einfach die Schleife in ebenfalls in einen eigenen Thread auslagern? Mit BeginAcceptClient wäre es noch schöner, da der zusätzliche Thread vermieden wird, aber auch etwas komplizierter.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!