Abgeteilt von MultiThreading - Änderung einer Variable wird im Thread nicht erkannt
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
Wenn du was leeres schickst, merkt "er" dass die Verbindung zu ist.
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.