在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);
,是問題?
似乎有點奇怪,你正在發送和接收文本。 –
正如其他評論提到的,你的問題是文字。一個.exe不是下一個文件。它是二進制數據。 – Pete