Autor Beitrag
huuuuuh
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: Sa 17.07.10 12:52 
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...
ausblenden volle Höhe 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(thisnew EventArgs());
                   
                    
                }
            }
            catch
            {
            }
            free[nr] = true;
            currconn--;
            ipoflastdisconnectedclient = ip;
            OnClientDisconnect(thisnew 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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 (msdn.microsoft.com/e...cket.connected.aspx).

Nimm den Code von der MSDN-Seite und ersetz den Connected Aufruf.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
while(IsConnected(socket) {
   while (IsConnected(socket) && socket.Available == 0)
   {
       // waiting for Data
       Thread.Sleep(200);
   }
   if (socket.Available > 0) { //process data }
}


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Sa 17.07.10 22:00 
user profile iconhuuuuuh hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 665
Erhaltene Danke: 19

win xp, (win vista), win 7
VS 2008 Express Edition, VS 2010 Express Edition, VS 2010 Professionell
BeitragVerfasst: 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