Frage

Wenn Daten über das Netzwerk zu lesen, können Sie einen Puffer angeben, die Daten in erhalten:

byte[] b = new byte[4096];
socket.Receive(b);

Jetzt ist mein erster Gedanke ist natürlich die Empfangspuffer zu verwenden, indem sie als eine Membervariable der Klasse deklariert. Meine nächste Frage ist, dass ich nicht alle Daten empfangen, die ich erwarte, also muss ich meine Daten puffern. Dies ist leicht durch die Verfolgung der Anzahl der empfangenen Bytes, und die Angabe der Offset zu erreichen:

socket.Receive(m_ReceiveBuffer, count, m_ReceiveBuffer.Length - count);

Nun, hier das Problem ist, dass, wenn es noch nicht genug ist, ich vermute, dass ich den Puffer wachsen, die Speichermittel zu kopieren und weiter in diesen Puffer empfangen. Unter der Annahme, dass etwas schief gelaufen ist, dieser Puffer würde weiter wachsen, und wenn groß genug, um Nachrichten empfangen werden, würde das System aus dem Speicher ausgeführt werden.

Alle Ideen, wie man richtig damit umgehen? Gibt es einen besseren Weg, um die Daten zu empfangen, als nur zu füllen, zu kopieren, wachsen, füllen, zu kopieren, wachsen, dass ich rede?

War es hilfreich?

Lösung

lesen in chunks:

const int ChunkSize = 4096;
int bytesRead;
byte[] buffer = new byte[ChunkSize];
while ((bytesRead = socket.Receive(buffer, 0, ChunkSize, SocketFlags.None)) > 0)
{
    byte[] actualBytesRead = new byte[bytesRead];
    Buffer.BlockCopy(buffer, 0, actualBytesRead, 0, bytesRead);
    // Do something with actualBytesRead, 
    // maybe add it to a list or write it to a stream somewhere
}

Andere Tipps

Bevor mit System.Net.Sockets.Socket beginnen, sind Sie sicher, dass Sie nicht System.Net.Sockets.TcpClient (oder UdpClient) verwenden können, die für Sie alle unordentlich Puffer funktioniert und wandelt es in eine leicht zu verwaltende streamen?

Wenn nicht, denken Sie daran, dass die Menge an Daten, die Sie empfangen nicht gleich sein muss, was Sie fordern, so sollten Sie immer auf dem Rückgabewert der recieve Funktion suchen. Und der einzige Weg, um nicht über genügend Arbeitsspeicher ausgeführt werden kann, indem die Verarbeitung, was Sie empfangen.

Zuerst trennen Sie den Code in die Daten empfängt und die Daten verarbeitet werden. Der Puffer erhalten sollte nur die Daten halten, bis der Code eine Chance bekommt, es zu dem Bearbeitungsbereich kopieren aus. Der Bearbeitungsbereich ist, wo Sie feststellen, ob Sie genügend Daten erhalten haben, etwas Nützliches zu tun. Lassen Sie die Daten in dem Netzwerk empfangen Puffer, bis dies geschieht. Für den Netzwerk-Empfangspuffer, ich glaube, einen kreisförmigen Puffer werden Sie mit Ihrer Idee helfen, einen Puffer der Wiederverwendung. Hoffentlich haben Sie eine Vorstellung von den Nachrichtengrößen. Das wird dazu beitragen, die Größe des Puffers zu bestimmen. Wenn Sie (oder so ähnlich) behaupten, wenn die Lese- und Zeiger des Ringpuffer treffen schreiben, dann erhöhen Sie die Größe des Puffers. Sobald die Größe des Puffers groß genug ist, sollten Sie in der Lage sein, genügend Daten aus dem Puffer in den Verarbeitungscode mit einer Rate schnell genug, dass der Ringpuffer nicht überläuft zu lesen.

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