Laden...

Fehlende Bytes

Erstellt von Mentor49 vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.637 Views
M
Mentor49 Themenstarter:in
35 Beiträge seit 2009
vor 14 Jahren
Fehlende Bytes

Hey,
ich arbeite zurzeit an meinem Projekt "WAS - Watch another Screen".
Es gibt einen Server und einen Client.
Der Server schickt als erstes ein Daten-Paket mit der Größe von ca. 3 Millionen Bytes.
Der Client liest die Bytes in einen Buffer ein.
Wenn ich mir nach dem Empfangen allerdings das empfangene Byte-Array anschaue, merke ich dass ab dem 16060. Byte nur noch 0en sind.

Hier die dazugehörigen Code-Schnipsel:

Die Send-Methode meiner Server-Klasse.

       public void Send(byte[] packet)
        {
            byte[] x = BitConverter.GetBytes(packet.Length);
            connection.Send(x); // connection = Socket
            connection.SendBufferSize = packet.Length;
            connection.Send(packet);
        }

Die GetPacket-Funktion meiner Client-Klasse:

public byte[] GetPacket()
        {
            while (client.Available == 0)
            {
                System.Threading.Thread.Sleep(50);
            }       
            byte[] l = new byte[4];
            client.Receive(l); // client = Socket
            int x = BitConverter.ToInt32(l, 0);
            byte[] buffer = new byte[x];
            client.ReceiveBufferSize = x;
            client.Receive(buffer);
            return buffer;
        }

Übrings: Vor jedem Packet werden immer erst 4 Bytes vom Server gesendet, welche dem Client sagen, welche Größe das Byte-Array hat, damit der Buffer dementsprechend groß initialisiert werden kann.

Was komisch ist: Wenn ich die Get-Packet - Funktion Zeile für Zeile debugge, kommen alle Bytes an...

Kennt ihr dieses Problem, könnt ihr mir helfen?

Lg Chris!

Gelöschter Account
vor 14 Jahren
client.Receive(buffer);  

was kommt denn da als rückgabewert?

allgemein könntest du in so einem fall das networktracing aktivieren. wie das geht erfährst du in der msdn.

M
Mentor49 Themenstarter:in
35 Beiträge seit 2009
vor 14 Jahren

Der Rückgabewert ist unterschiedlich.
Aber zusammengefasst zwsichen 10'000 und 100'000.
Aber Welten weg von der eigenentlichen Anzahl von Bytes, die gesendet wurden! (Wie gesagt, ~3'000'000)

Lg

Gelöschter Account
vor 14 Jahren

na dann kommt nciht alles an. hier wäre der trace output interessant.

M
Mentor49 Themenstarter:in
35 Beiträge seit 2009
vor 14 Jahren

Ich kannte den Begriff "Network Tracing" vorher garnicht.
Zwar finde ich diesen Eintrag in der MSDN: http://msdn.microsoft.com/en-us/library/a6sbz1dx.aspx , allerdings verstehe ich nicht wie es funktioniert und nicht was das überhaupt ist.
Der Name selbst sagt ja soviel aus wie "Netzwerk Verfolgung" - erinnert mich an WireShark.
Ist das sowas in der Art?
Wäre dir sehr dankbar wenn du mich in dem Thema ein wenig aufklären würdest (;

Lg

151 Beiträge seit 2003
vor 14 Jahren

Wie hast du denn die Sockets initialisiert, also ProtocolType SocketType etc.?

Gelöschter Account
vor 14 Jahren

was wireshark ist, weiß ich nciht. du kannst dich bei aktiviertem tracing mit dem debugger dranhängen und im outputwindow sehen, was genau verarbeitet und gesendet wird und was empfangen wird.

M
Mentor49 Themenstarter:in
35 Beiträge seit 2009
vor 14 Jahren

Wie hast du denn die Sockets initialisiert, also ProtocolType SocketType etc.?

        public WASClient()
        {
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        }

was wireshark ist, weiß ich nciht. du kannst dich bei aktiviertem tracing mit dem debugger dranhängen und im outputwindow sehen, was genau verarbeitet und gesendet wird und was empfangen wird.

Hört sich intressant an, allerdings verstehe ich (weder durch den Eintrag der MSDN, noch durch Google) wie man Tracing benutzt.
Ein Beispiel wäre super!

Lg Chris

Gelöschter Account
vor 14 Jahren

folge den schritten, die in der msdn beschrieben sind und verfolge das outputfenster in VS

151 Beiträge seit 2003
vor 14 Jahren

Was gibt denn BitConverter.GetBytes(packet.Length); zurück?
Sicher das die Länge richtig konvertiert wird?

Probiere doch mal beim Client den buffer manuell zu setzen für das 3MB file.

Also:
byte[] buffer = new byte[3000000]; //natürlich auf den genauen Wert...

M
Mentor49 Themenstarter:in
35 Beiträge seit 2009
vor 14 Jahren

@JAck30lena: Okay ich probier mich dran! Danke!
@monson: Das war das erste was ich überprüft hab (;

Lh

151 Beiträge seit 2003
vor 14 Jahren

Hab es jetzt mal nachgebaut.

Problem:

Das Sendes des Packets passiert zu schnell, der Empfänger verarbeitet noch die Geschichte mit der Packetgröße, da ist der Server schon längst wieder am senden.

Wenn du einen Delay von einer Sekunde dazwischen packst sollte es funktionieren. Sprich:


            byte[] x = BitConverter.GetBytes(packet.Length);
            connection.Send(x); // connection = Socket
            connection.SendBufferSize = packet.Length;
            Thread.Sleep(1000);             //Sekündchen warten
            connection.Send(packet);

Gruß,
moson