使用 Socket.SendFile() 传输 *.exe 文件时出现问题

本文关键字:文件 问题 exe SendFile Socket 传输 使用 | 更新日期: 2023-09-27 17:57:09

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

我正在尝试使服务器通过System.Net.Sockets.Socket.SendFile(string filename)方法传输文件,并让客户端接收文件。 客户端将收到的字节追加到它创建的文件的末尾,以在其端重建发送的文件。 这一切都有效 - 至少对于基本文本文件。

当我尝试发送 *.exe 文件时,收到的 *.exe不起作用。 在记事本++中打开源.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); ,是问题所在?

使用 Socket.SendFile() 传输 *.exe 文件时出现问题

这是问题所在:

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

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

此外,您应该使用 EndReceive返回值来了解您读取了多少数据:

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

fileStream应该是实际的流,而不是TextWriter

这也适用于文本文件 - 如果您将文本视为二进制,则最终会在另一端获得相同的内容,您仍然可以将其作为文本阅读。如果您将二进制数据视为文本,您最终会得到一堆损坏的数据......