Entwickler-Ecke
Netzwerk - Socket Exception wird nicht ausgelöst
huuuuuh - Sa 17.07.10 12:52
Titel: Socket Exception wird nicht ausgelöst
hallo,
hab mal wieder nen problem mit der Socketprogrammierung. zu dem zweck hab ich mir nen server geschrieben, der mehrere verbindungen verwaltet. Hier die Methode, welche für das Empfangen von Nachrichten zuständig ist...
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 receiving(object temp) { int nr = (int)temp; string ip = ""; try { ip = client[nr].Client.RemoteEndPoint.ToString(); } catch { } try { while (client[nr].Connected) { while (!(client[nr].Available>0)) { Thread.Sleep(200); } client[nr].Client.Receive(data); lastreceived = Encoding.ASCII.GetString(data); OnReceive(this, new EventArgs()); } } catch { } free[nr] = true; currconn--; ipoflastdisconnectedclient = ip; OnClientDisconnect(this, new EventArgs()); } |
das problem: die methode beendet sich nicht, was sie eigentlich soll, wenn sich der client disconnectet hat. die methode durchläuft immer wieder die markierte schleife...
hab schon versucht, die schleifenbedingung so zu modifizieren:
while ((!(client[nr].Available>0)) && client[nr].Connected)
bringt leider auch nix :(
hoffe mal, mir kann jemand helfen
mfg
danielf - Sa 17.07.10 21:03
Hi,
wenn du nichts ließt (wenn der Client die Verbindung trennt ist available immer gleich 0) dann wird die Exception nicht geworfen. Die wird nur beim Versuchen zu lesen oder zu schreiben geschmissen. Gleich verhält es sich auch mit dem Connected Property. Dieses wird nur upgedated wenn du auf dem Socket ließt und schreibst (
http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.connected.aspx).
Nimm den Code von der MSDN-Seite und ersetz den Connected Aufruf.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| while(IsConnected(socket) { while (IsConnected(socket) && socket.Available == 0) { Thread.Sleep(200); } if (socket.Available > 0) { } |
Allerdings ist das "unnütz". Du kannst den TcpListener und TcpServer verwenden. Diese verfügen über asynchrone lese Vorgänge. Da wirst du auch informiert, wenn das lesen erfolgreich war.
Den ein Sleep sollte man wenn's geht nie verwenden :o
Gruß
huuuuuh - Sa 17.07.10 21:39
ah. ok... danke für die erklärung...
mit TcpClient und TcpServer hab ich auch schon rumexperimentiert. allerdings hab ich letzendlich immer methoden genutzt, die auch sockets haben. deswegen bin ich dann immer wieder auf die sockets gekommen^^ außerdem will ich eh mehrere möglichkeiten ausprobieren ;)
und zum Sleep(): receiving läuft eh in nem eigenen thread, von daher kann das Sleep() nich viel schaden anrichten. hoffe ich...
ohne Sleep() hat mein rechner schon fast gestreikt. cpu-auslastung auf 110%, nix ging mehr :D
Yogu - Sa 17.07.10 22:00
huuuuuh hat folgendes geschrieben : |
und zum Sleep(): receiving läuft eh in nem eigenen thread, von daher kann das Sleep() nich viel schaden anrichten. hoffe ich... |
Es kommt drauf an, wie zügig die Verbindung ablaufen soll. In deiner Implementierung wird bis zu 200 Millisekunden länger gewartet, bis eine Nachricht verwendet wird, als nötig. Denn du prüfst ja nur alle 200ms, ob
client[nr].Available>0 wahr ist. Da kann es schon mal zu nervigen Verzögerungen führen.
huuuuuh - Sa 17.07.10 22:22
wenn ich mal (halbwegs) fertig sein sollte, werd ich mal schaun, wie weit ich runtergehn kann^^ bis dahin muss es so gehn... für nen netzwerkchat sollte das aber ausreichen
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!