Laden...

Server erkennt nicht, dass die Clients nicht mehr leben

Erstellt von Lost-Ha(n)f-PHP vor 13 Jahren Letzter Beitrag vor 13 Jahren 991 Views
Hinweis von herbivore vor 13 Jahren

Abgeteilt von MultiThreading - Änderung einer Variable wird im Thread nicht erkannt

Lost-Ha(n)f-PHP Themenstarter:in
58 Beiträge seit 2007
vor 13 Jahren
Server erkennt nicht, dass die Clients nicht mehr leben

Hallo Leute,

jetzt habe ich aber ein ähnliches Problem auf der Gegenstelle. Der Server greift in diesem Fall von zwei Threads auf den TcpClient zu. Beide Threads sind nicht der Main-Thread, der das Object instanziiert und die Verbindung aufbaut. Jedoch bemerken die Threads nicht, dass die Gegenstelle schon lange tot ist.

Folgender Versuch:


private void ReadLoop() {
	//[...]

	while(_Connected) {
		try {
			Thread.Sleep(10);
			
			_cln.GetStream().Write(new byte[0], 0, 0); //Das sollte ohne Gegenstelle nicht funktionieren
			
			if(_cln.Available == 0) { continue; }
			
			bytes = new byte[length];
			if((read = _cln.GetStream().Read(bytes, 0, length)) > 0) {
				_StatBytesReceived += read;
				UpdateStatistics();
				
				tmpBuffer = System.Text.Encoding.UTF32.GetString(bytes, 0, read)
				lock(_LockObject) {
					_Buffer += tmpBuffer;
				}
			}
		} catch {
			ShutDown();
		}
	}
}

Ohne Daten spielt sich die Aktion lediglich im Bereich


	try {
		Thread.Sleep(10);

		_cln.GetStream().Write(new byte[0], 0, 0); //Das sollte ohne Gegenstelle nicht funktionieren

		if(_cln.Available == 0) { continue; }

ab.

Nun habe ich einfach eine Verbindung mit telnet aufgebaut und dann wieder geschlossen. Beim Debug steht _cln.Connected noch auf true und er meint auch lesen und schreiben zu können...

An sonsten funktioniert der TcpClient ohne Probleme. Mir fehlt da leider jegliche Idee.
Noch als Hinweis, da dieses Thema oben einmal aufgekommen ist: Ich verwende ein x64 System, kompiliere aber für x86.

Ich bin für alle Ideen dankbar. Falls noch Informationen fehlen sollte, werdet ihr euch sicher melden.

Danke im Voraus.

[EDIT]
Kleine Korrektur:
Wenn ich _cln.GetStream().WriteByte((byte)65); aufrufe, wenn merkt er schon, dass da nichts mehr ist. aber ich habe nicht vor konstant A's durch die Gegend zu posten 😉

Wobei ich wieder bei meiner Einstiegsfrage bin: Wieso merkt er das nicht?

Mit freundlichem Gruß

Lost-Ha[n]f-PHP

C
2.121 Beiträge seit 2010
vor 13 Jahren

Wenn du was leeres schickst, merkt "er" dass die Verbindung zu ist.

I
1.739 Beiträge seit 2005
vor 13 Jahren

Leider ist die Implementation unvollständig.
Das FIN des Clients wird ignoriert, es gibt jedoch die Möglichkeit die Clients zu prüfen(abgesehen von der Lowlevelprüfung
Müsste ich allerdings nachsehen.