Unstimmige Werte durch Sockets

Hallo liebe Community, ich bin es mal wieder, mit einem Problem, für das ich wohl zu dumm zu sein scheine (wie ja sonst auch..).

Ich und ein Kollege arbeiten an einem Patcher und arbeiten mit Socktets, theoretisch funktioniert die Kommunikation, jedoch harkt es schon bei der Übermittlung der Versionsnummer (ich bekomme immer die Version 0.0.0.0). Die Trennung der Verbindung scheint auch nicht zu funktionieren, denn bei mir sagt er, dass er die Verbindung nicht trennen konnte.

Sein Code:
C#:
                Client.Receive(b);
                switch (b[0])
                {
                        //...
                    case 0x01:
                        msg = new byte[256];
                        msg[0] = 0x02;
                        msg[1] = version.Major;
                        msg[2] = version.Minor;
                        msg[3] = version.Release;
                        msg[4] = version.Patch;
                        Client.Send(msg);
                        Console.WriteLine("sent Version " + version);
                        break;
                        //...
                    case 0xFF:
                        msg = new byte[256];
                        msg[0] = 0xFF;
                        Client.Send(msg);
                        connected = false;
                        Console.WriteLine("connection closed...");
                        break;
                }

Mein Code:
C#:
        private void button1_Click(object sender, EventArgs e)
        {
            Client.Send(REQUESTVERSION);
            Client.Receive(ReadBuffer);
            richTextBox1.Text += "Version ist " + new VersionInfo(ReadBuffer[1], ReadBuffer[2], ReadBuffer[3], ReadBuffer[4]) + "\n";
            ClearBuffer(ReadBuffer);
        }
        // ...
        private void button3_Click(object sender, EventArgs e)
        {
            Client.Send(CLOSE);
            Client.Receive(ReadBuffer);
            if (ReadBuffer[0] == 0xFF)
            {
                Client.Close();
                richTextBox1.Text += "Verbindung zum Server wurde beendet.\n";
                button1.Enabled = false;
                button2.Enabled = false;
                timer1.Stop();
            }
            else
                richTextBox1.Text += "Verbindung zum Server konnte nicht beendet werden.\n";
        }

Der Verbindungsaufbau und die KeepAlive-Kommunikation allerdings laufen flüssig ..

Wenn ihr meinen oder seinen Fehler entdeckt, wäre ich sehr dankbar.

Mfg,
JustShinigami
 
Zuletzt bearbeitet von einem Moderator:

Endurion

Erfahrenes Mitglied
Brauche mehr Input. Was ist Client? Was ist ReadBuffer?

Sonst die üblichen Socket-Grundlagen, du empfängst nicht immer alles in einem Rutsch. Prüf nach Receive, ob du auch wirklich alle erwarteten Bytes empfangen hast.
Das bedingt auch, dass du entweder am Nachrichten-Header-Byte erkennst, wie lange das Paket ist; oder eine Länge voran schicken musst.

Ausserdem: Sendet ihr da immer 256 Bytes am Stück? Die Pakete scheinen ja doch etwas kleiner zu sein.
 
Client ist eine Variable vom typ Socket und ReadBuffer ist vom typ byte[].
Der Code an sich ist aber richtig, oder?
wenn ja, werd ich nochmal nach nem logikfehler suchen.

Mfg,
JustShinigami
 

sheel

I love Asm
du empfängst nicht immer alles in einem Rutsch.
Prüf nach Receive, ob du auch wirklich alle erwarteten Bytes empfangen hast.
Das bedingt auch, dass du entweder am Nachrichten-Header-Byte erkennst, wie lange das Paket ist; oder eine Länge voran schicken musst.
Der Code an sich ist aber richtig, oder?
Nein, eben nicht :rolleyes:

Man darf nicht erwarten, dass die Daten, die mit einem Send gesendet wurden,
auch genau in der Menge durch ein Receive wieder empfangen werden.
Die Bytes eines Send können auch über 3 Receive verteilt ankommen
(in der richtigen Reihenfolge, bei TCP, aber trotzdem verteilt),
oder 3 Sends können durch ein Receive angenommen werden usw.
 
Oh, hmm, ich sollte wohl aufmerksamer lesen..
Werde dann mal ein paar Tests von euren Vorschlägen anstellen, sobald er online ist.
Danke an euch beide.

Mfg,
JustShinigami