2012-01-23 2 views
1

UDPソケットを送信しています。受信したすべてのバイトをメモリストリームに書き込み、メモリストリームオブジェクトをデシリアライズ用に渡します。 オブジェクトタイプ 'ImagePacket'のアセンブリIDがありませんオブジェクト型 'ImagePacket'のアセンブリIDがありません。シリアル化例外が発生しました。C#

レシーバー終了コード:

    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 
+0

ImagePacketは自分のクラスですか? –

+0

はいImagePacketは自分のクラスです – Samie

+0

[MSDN投稿](http://social.msdn.microsoft.com/Forums/eu/netfxremoting/thread/976b61ca-443f-4e6c-86d9-521542c4c8c8)は、これがストリームに関連する可能性があることを示しています腐敗。さらに進む前に、受信したバイトが送信されたバイトと同じであることを確認してください。特に(すでに言及したように)UDPは精度についてはあまり気にしません...正確さを望むならTCPを使います。 –

答えて

1

は、私がここでの問題は、単にである疑いがある:それはTCPであるようにあなたは、UDPを使用しています。 UDPはパケットベースですが、a:はパケットが到着することを保証せず、b:パケットが破棄されたり複製されたりすることを保証しません。

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

コードを使用したい方法でネットワークを使用するにはTCPを使用します。それ以外の場合は、順序が狂ったパケット、破棄されたパケット、複製されたパケットを検出する責任があります。これは、たとえば、パケットにシーケンス番号を追加し、何が受信されたかを追跡し、必要に応じて順序を変更したり、重複を削除したり、途中で中断したものを再要求したりすることができます。基本的には、TCPが追加するすべてのものを書き直してください!非常に具体的なシナリオがない限り、TCPスタック(NICとOSレベルのサポートを持つ)がこれよりも優れた作業を行う可能性が高いです。

+0

副題として、**速度**が重要なときにUDPが意味を持ち、失敗したものを無視するという意味でも最新のデータを持っています。しかし、あなたはストリームとしてそれを使用しています - データがストリームの場合、私はまずTCPを見ます。 –

+0

私は大部分の実装がUDP.see ref http://en.wikipedia.org/wiki/Real-time_Transport_Protocolで行われるため、UDPの組み合わせでリアルタイムトランスポートプロトコルを使用することを意図しています。 – Samie

関連する問題