2013-02-01 30 views
0

在Win7 x64上的Visual Studio 2012 Ult中,在.NET 4.5中使用C#。使用Socket.SendFile()發送* .exe文件時出現問題

我試圖通過System.Net.Sockets.Socket.SendFile(string filename)方法和客戶端來接收它的服務器傳輸文件。客戶端將接收到的字節附加到它創建的文件末尾,以重建發送的文件。這一切都起作用 - 至少對於基本的文本文件。

當我嘗試發送* .exe文件時,收到的* .exe不起作用。在Notepad ++中打開源* .exe和客戶端副本,看起來該文件是正確的,只是某些奇怪的字符不正確。我的問題是我如何解決這個問題?

由於服務器代碼實際上只是使用Socket.SendFile(string filename)發送文件而沒有其他相關選項可用,因此我假設客戶端是問題所在。

在客戶端:

private void ListenAndReport(Socket socket) 
{ 
    EndPoint remoteEndPoint = socket.RemoteEndPoint; 
    ReceiveObject obj = new ReceiveObject(socket); 
    socket.BeginReceive(obj.buffer, 0, packetSize, SocketFlags.None, new AsyncCallback(ReceiveFromListen), obj); 
} 
private void ReceiveFromListen(IAsyncResult ar) 
{ 
    ReceiveObject obj = (ReceiveObject)ar.AsyncState; //ReceiveObject just holds a byte[packetSize] buffer and a Socket 

    string received = Encoding.UTF8.GetString(obj.buffer); 
    WriteToFile(received); 

    obj.socket.EndReceive(ar); //!!! necessary? Doesn't seem to make a difference. 
    ListenAndReport(obj.socket); 
} 
private void WriteToFile(string text) 
{ 
    fileStream.Write(text); 
    fileStream.Flush(); 
} 

我的猜測是,在string received = Encoding.UTF8.GetString(obj.buffer);編碼是不正確的,但我已經嘗試了所有的Encoding.something選項,他們都沒有正確地傳輸文件。

另外,也許文件編寫器,System.IO.TextWriter fileStream = File.AppendText(string filename);,是問題?

+1

似乎有點奇怪,你正在發送和接收文本。 –

+0

正如其他評論提到的,你的問題是文字。一個.exe不是下一個文件。它是二進制數據。 – Pete

回答

4

這就是問題所在:

string received = Encoding.UTF8.GetString(obj.buffer); 

你爲什麼要這麼做?這是而非文字。您應該將字節數組寫入文件,而不是字符串。

此外,您應該使用返回值的EndReceive知道你有多少數據讀:(fileStream應該是一個實際,不是TextWriter

int bytesRead = obj.socket.EndReceive(ar); 
fileStream.Write(obj.buffer, 0, bytesRead); 

這也適用於文本文件 - 如果您將文本視爲二進制文件,則會在另一端獲得相同的內容,您仍然可以將其作爲文本讀取。如果你把二進制數據當作文本處理,你最終會遇到一堆損壞的數據......

+0

閱讀你的答案後,我能夠找到http://stackoverflow.com/questions/381508/can-a-byte-array-be-written-to-a-file-in-c,現在我的客戶端正確接收。謝謝! – Nat

相關問題