1

UDPソケットを介してシリアル化された大きな画像オブジェクトを送信しています。受信したすべてのバイトをメモリストリームに書き込み、逆シリアル化のためにメモリストリームオブジェクトを渡すと、オブジェクトタイプ「ImagePacket」のアセンブリIDなしという例外がスローされます。

受信者終了コード:

                 ImageStream = new MemoryStream();

                while (AccumulatingBytes <= TotalSizeOfComplexObject)
                 {

                  byte[] Recievedbytes = UdpListener.Receive(ref RemoteEndPoint);

                  ImageStream.Write(Recievedbytes, 0, Recievedbytes.Length);

                   AccumulatingBytes += Recievedbytes.Length;
                 } 


                  ImageStream.Position = 0;

                    imagecontainer = (ImageContainer)bformater.Deserialize(ImageStream);//Here the Code Segment Breaks and Exception thrown
4

1 に答える 1

1

ここでの問題は単純だと思います。TCPのようにUDPを使用しています。UDPはパケットベースですが、a:はパケットが順番に到着することを保証しません。また、b:はパケットがドロップまたは複製されないことを保証しません。

私はあなたがいくつかの故障を持っていることを完全に期待しています。複数のメッセージを送信している場合は、一部が削除され、次のメッセージからいくつかが含まれている可能性もあります。

コードで使用する方法でネットワークを使用するには、TCPを使用します。それ以外の場合、順序が正しくない、ドロップされた、複製されたパケットを理解する責任は完全にあなたにあります。これは、たとえば、パケットにシーケンス番号を追加し、受信したものを追跡することによって行うことができます-必要に応じてそれらを並べ替え、重複を削除し、途中で死んだものを再要求します。基本的に、TCPが追加するすべてを書き直します!非常に具体的なシナリオがない限り、TCPスタック(NICおよびOSレベルのサポート付き)がこれをうまく実行する可能性が高くなります。

于 2012-01-23T13:07:38.963 に答える