使用Socket.SendFile()传输* .exe文件时出错

时间:2013-02-01 20:12:30

标签: c# .net sockets sendfile

在Win7 x64上的Visual Studio 2012 Ult中使用.NET 4.5中的C#。

我正在尝试使服务器通过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 :(得分:4)

这是问题所在:

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

你为什么要这样做?这是不是文字。您应该将字节数组写入文件,而不是字符串。

此外,您应该使用EndReceive返回值来了解您已阅读的数据量:

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

fileStream应该是实际的,而不是TextWriter。)

这也适用于文本文件 - 如果您将文本视为二进制文件,则最终会在另一端使用相同的内容,您仍然可以将其视为文本。如果您将二进制数据视为文本,最终会导致大量损坏的数据......