2012-03-06 155 views
1

我在傳送如下因素140KB的圖像文件通過網絡使用套接字麻煩:發送過使用套接字網絡圖像,搞砸數據

original image

的文件的開頭被正確地轉移,那麼其餘被搞砸導致以下結果:

messed up image

我有一個服務器,即等待文件和連接到服務器並啓動文件轉院的客戶端。當客戶端關閉連接時,服務器知道文件已經完成發送並保存。正在收集

全部在服務器端的數據字節列表(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(); 
    } 

我在cient側使用了相同的ByteArrayToFile函數,它正確保存了圖像。看起來客戶端正在發送正確的數據,但是當服務器接收到它時,它會變得混亂。我在攻防兩端保存的文件,由客戶端和服務器,然後比較它們:

enter image description here

請注意,在底部中央的紫線/條。這表明,數據不匹配存在,但是請注意,在一開始完全吻合..

我不明白怎麼能這樣呢,因爲我使用的名單,只是不斷增加的字節列表,直到有沒有什麼可讀的!?如果你沒有解決方案,你可以給我任何提示嗎?!這個問題一直困擾着我好幾個星期,希望能夠把它弄清楚。謝謝!

+0

你有沒有在你發送相同的圖像生成的字節[]字節[]數據驗證?發佈生成字節的代碼[] – 2012-03-06 19:26:50

+0

@Ramhound對不起,我不確定你的意思。客戶端從Web上獲取圖像,然後將其上傳到服務器。當我從httpwebresponse的客戶端的字節列表中收集所有的數據時,我保存圖像,驗證它是否有效,並保存並運行。請讓我知道,如果這是你的問題。謝謝! – user1192403 2012-03-06 19:29:52

回答

1

你能從你的數據比較的問題是什麼告訴?服務器是簡單地丟失字節還是數據損壞?多少數據傳輸正確?

考慮使用像Wireshark的東西,因爲他們來了電線檢查字節。這應該可以幫助您確定它是否是網絡錯誤或您的服務器代碼中的某些內容。

+0

感謝您的建議。從我可以告訴最初的40%得到正確transfared,然後從那裏大部分數據是亂七八糟,而不是簡單地在段(如前1024個字節確定,然後休息亂),但它得到弄糟在字節級,像10個字節確定,兩個字節不匹配等。 – user1192403 2012-03-06 19:33:38

+0

另外,如果我有一個較大的圖像測試,一個較小的比例被正確發送,其餘的是亂七八糟。幾乎看起來像第一個段(1024字節)總是完美的,但之後它會混淆起來,這很奇怪。 – user1192403 2012-03-06 19:34:48

+0

當你得到一個包時,你可能想要嘗試打印接收緩衝區大小('iRx')。如果這與數據損壞開始的點相關,則可能在複製到文件緩衝區時丟棄數據。 – TMN 2012-03-06 19:52:35

相關問題