2012-03-06 6 views
1
私が使用してソケットネットワーク上folowing 140キロバイトの画像ファイルを送信するトラブルを抱えている

は、ソケットを使用してネットワーク経由で画像を送信する、データを台無し

original image

をファイルの先頭、その後、正しく転送されます残りは次のような結果につながるめちゃめちゃます:

messed up image

私はファイルを待ち、サーバ、およびサーバに接続し、ファイルtranferを開始し、クライアントを持っています。クライアントが接続を閉じると、サーバーはファイルの送信が完了したことを認識して保存します。

サーバ側のすべてのデータは、前にファイルに書き込まれ、バイトのリスト(GLOBAL.FILE_BUFFER)に収集されている:

public void OnDataReceived(IAsyncResult asyn) 
    { 
     try 
     { 
       SocketPacket socketData = (SocketPacket)asyn.AsyncState; 
       int iRx = socketData.m_currentSocket.EndReceive(asyn); 

       for (int f = 0; f < iRx; f++) 
       { 
        GLOBAL.FILE_BUFFER.Add(socketData.dataBuffer[f]); // Collect all the incoming data into a buffer 
       } 

       WaitForData(socketData.m_currentSocket, socketData.socket_id, REQUEST_INDEX_ID); 
     } 
     catch (ObjectDisposedException) 
     { 

     } 
     catch (SocketException se) 
     { 

     } 
    } 

これは私がファイルへの書き込みに使用しているコードです:

 public static void ByteArrayToFile(string _FileName, byte[] _ByteArray, int BytesRead) 
    { 
     System.IO.FileStream _FileStream = new System.IO.FileStream(_FileName, System.IO.FileMode.Create, System.IO.FileAccess.Write); 
     _FileStream.Write(_ByteArray, 0, BytesRead); 
     _FileStream.Close(); 
    } 

私は同じ側で同じByteArrayToFile関数を使用し、正しく画像を保存しました。クライアントは正しいデータを送信しているように見えますが、サーバがそれを受信すると、データが乱れてしまいます。私は、クライアントが、サーバによって、両端にファイルを保存し、それらを比較した:

enter image description here

お知らせ下部中央にある紫色のライン/バー。データがそこに一致していないことを示しますが、最初に完全に一致することに気付きます。

リストを使用しているので、何も読んで残った!あなたは解決策を持っていない場合は、私に任意のヒントを教えてくださいできますか?この問題は数週間にわたって私を悩ませていました。ありがとう!

+0

送信したバイト[]のデータが、画像によって生成されたバイト[]と同じであることを確認しましたか?バイトを生成するコードを投稿する –

+0

@Ramhound申し訳ありませんが、あなたは何を意味するのか分かりません。クライアントはWebからイメージを取り出し、それをサーバーにアップロードします。 httpwebresponseからクライアント側のすべてのデータをバイトリストで収集すると、イメージが保存され、有効で保存され、動作することが確認されます。それがあなたの質問だったら教えてください。ありがとう! – user1192403

答えて

1

データの比較から、問題点を教えてください。サーバーが単にバイトを削除しているのか、またはデータが破損していますか?どのくらいのデータが正しく転送されますか?

Wiresharkのようなものを使用して、ワイヤから出てくるバイトを調べることを検討してください。それはネットワークエラーかサーバーコード内の何かを判断するのに役立ちます。

+0

提案していただきありがとうございます。私が最初に聞いたことから、最初に40%は正確にトランスファされていると言いますが、そこからデータの大半はセグメントではなく(最初の1024バイトのようなものです)、10バイトのようにバイトレベルで混乱します。 2バイトは一致しません。 – user1192403

+0

また、大きな画像でテストすると、小さなパーセンテージが正しく送信され、残りの部分が混乱します。ほとんどの場合、最初のセグメント(1024バイト)は常に完璧ですが、それ以降は変です。 – user1192403

+0

パケットを受け取ったときに受信バッファサイズ( 'iRx')を印刷するとよいでしょう。これがデータの破損が始まるポイントに関連する場合、ファイルバッファにコピー中にデータを破棄する可能性があります。 – TMN

関連する問題