Hallo Leute,
ich habe einen Server, der mittels BinaryFormatter Objekte serialisiert und dann in sehr kurzen Intervallen wiederholt an N verschiedene Clients schickt. Dort werden die Objekte wieder deserialisiert.
Sowohl auf Client als auch auf Server-Seite nutze ich einen TCPClient und schreibe / lese in/von dessen NetworkStream.
Meine Objekte sind bis zu 104000 Bytes groß. Die BufferSize des Arrays zum Lesen aus dem Stream ist 1048576 (1MB groß).
Frage: Die BufferSize zum Lesen / Schreiben kann auch an den TCPClients gesetzt werden.
// setzen der BufferSize am TcpClient. ist das nötig ?
mTcpClient.SendBufferSize = MySocket.BUFFERSIZE;
mTcpClient.ReceiveBufferSize = MySocket.BUFFERSIZE;
(...:)
// setzen der größe des readbuffers. wie verhält sich das zur buffersize am tcpclient ?
mReceiveBuffer = new byte[MySocket.BUFFERSIZE];
var networkStream = mTcpClient.GetStream();
networkStream.BeginRead(mReceiveBuffer, 0, mReceiveBuffer.Length, new AsyncCallback(BeginReadCallback), networkStream );
Ich nehme an die Send/ ReceiveBufferSize am TCPClient muß immer mindestens so groß sein wie die Größe des Arrays zum lesen der Daten ? Ist das richtig ?
Dennoch sind immer mal wieder die Buffer augenscheinlich korrupt, da der BinaryFormatter von Zeit zu Zeit die Objekte nicht serialisieren kann.....
Woran könnte das liegen ?
Gruß,
Impact
Hallo impact,
Dennoch sind immer mal wieder die Buffer augenscheinlich korrupt, da der BinaryFormatter von Zeit zu Zeit die Objekte nicht serialisieren kann.....
was heißt korrupt? Wie äußert sich das "nicht serialisieren können"? Bekommst du Exceptions? Welche?
Gruß dev
Liegt das Problem beim Deserialisieren auf Empfänger-Seite ? Wenn, wie Du schreibst, der BinaryFormatter die Objekte nicht serialisieren kann, liegt es ziemlich sicher nicht am Netzwerk-Code.
Falls es wie ich vermute beim Deserialisieren hakt, bist Du sicher, dass alle versendeten Objekte auf Sender- und Empfängerseite bekannt sind ? Tritt der Fehler immer bei denselben Objekttypen auf ?
Hi,
Ich hatte mal eine im Netz synchrone Anwendung geschrieben...
Dort hatte ich ähnliche Probleme.. in unregelmäßigen Abständen sind Exceptions aufgetreten. Bei mir war es ein Timing Problem. Jede Client Verbindung auf dem Server war ein eigener Thread ... wenn zwei "gleichzeitig" eine Aktualisierungsinfo an die anderen Clients posten wollten (serialisierte Objekte per Stream) wurde dann gelegentlich gleichzeitig auf dem gleichen Kanal des Clients geschrieben.
Problem hatte ich gelöst indem ich alle Meldungen eines Kanals/clients in eine Thread sichere liste packe und ein separater Thread diese dann im Hintergrund abarbeitet.
Hoffe das ich behilflich sein konnte oder der Tip in die richtige Richtung geht 😃
Gruß
Sascha