Frage

Mein Problem ist, dass beim Streamen eines kontinuierlichen Datenstroms über ein LOKALES LAN-Netzwerk manchmal zufällige Bytes verloren gehen.

Derzeit ist der Code so eingerichtet, dass er etwa 1027 Bytes etwa 40 Mal pro Sekunde über ein LAN streamt, und manchmal (sehr selten) gehen ein oder mehrere Bytes verloren.

Was mich verblüfft, ist, dass das eigentliche Byte nicht „verloren“ geht, sondern unabhängig von den Originaldaten einfach auf 0 gesetzt wird.(Ich verwende übrigens TCP)

Hier ist der Sendecode:

    public void Send(byte[] data)
    {
        if (!server)
        {
            if (CheckConnection(serv))
            {
                serv.Send(BitConverter.GetBytes(data.Length));
                serv.Receive(new byte[1]);
                serv.Send(data);
                serv.Receive(new byte[1]);
            }
        }
    }

und der Empfangscode:

    public byte[] Receive()
    {
        if (!server)
        {
            if (CheckConnection(serv))
            {
                byte[] TMP = new byte[4];
                serv.Receive(TMP);
                TMP = new byte[BitConverter.ToInt32(TMP, 0)];
                serv.Send(new byte[1]);
                serv.Receive(TMP);
                serv.Send(new byte[1]);
                return TMP;
            }
            else return null;
        }
        else return null;
    }

Das Senden und Empfangen der leeren Bytes dient lediglich dazu, das System gewissermaßen synchron zu halten.Persönlich denke ich, dass das Problem auf der Empfangsseite des Systems liegt.Ich konnte diesen Jet jedoch nicht beweisen.

War es hilfreich?

Lösung

Nur weil du gibst Receive(TMP) Ein 4-Byte-Array bedeutet nicht, dass dieses Array mit 4 Bytes gefüllt wird.Der Empfangsaufruf darf irgendwo dazwischen eingefügt werden 1 Und TMP.Length Bytes in das Array.Sie müssen die zurückgegebene Ware überprüfen int um zu sehen, wie viele Bytes des Arrays gefüllt waren.

Netzwerkverbindungen basieren auf Streams und nicht auf Nachrichten.Alle Bytes, die Sie auf die Leitung übertragen, werden einfach in einer großen Warteschlange verkettet und auf der anderen Seite eingelesen, sobald sie verfügbar sind.Wenn Sie also die beiden Arrays gesendet haben 1,1,1,1 Und 2,2,2,2 Es ist durchaus möglich, dass Sie auf der Empfängerseite anrufen Receive dreimal mit einem 4-Byte-Array und get

  • 1,1,0,0 (Retourniert erhalten 2)
  • 1,1,2,2 (Retourniert erhalten 4)
  • 2,2,0,0 (Retourniert erhalten 2)

Sie müssen sich also die Werte ansehen, die Sie erhalten haben Receive und machen Sie weiter, bis Ihr Byte-Array voll ist.

byte[] TMP = new byte[4];

//loop till all 4 bytes are read
int offset = 0;
while(offset < TMP.Length)
{
    offset += serv.Receive(TMP, offset, TMP.Length - offset, SocketFlags.None);
}
TMP = new byte[BitConverter.ToInt32(TMP, 0)];

//I don't understand why you are doing this, it is not necessary.
serv.Send(new byte[1]); 

//Reset the offset then loop till TMP.Length bytes are read.
offset = 0;
while(offset < TMP.Length)
{
    offset += serv.Receive(TMP, offset, TMP.Length - offset, SocketFlags.None);
}

//I don't understand why you are doing this, it is not necessary.
serv.Send(new byte[1]);

return TMP;

Abschließend haben Sie gesagt: „Der Netzwerk-Stream verwirrt Sie“. Ich wette, das oben genannte Problem ist eines der Dinge, die Sie verwirrt haben. Wenn Sie auf eine niedrigere Ebene wechseln, werden diese Komplexitäten nicht beseitigt.Wenn Sie diese komplexen Teile entfernen möchten, damit Sie sie nicht bearbeiten müssen, müssen Sie eine Bibliothek eines Drittanbieters verwenden, die sie innerhalb der Bibliothek für Sie verwaltet.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top