【问题标题】:Trouble transmitting *.exe file with Socket.SendFile()使用 Socket.SendFile() 传输 *.exe 文件时遇到问题
【发布时间】:2013-01-17 05:36:51
【问题描述】:

在 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); 可能是问题所在?

【问题讨论】:

  • 似乎有点奇怪,您正在发送和接收文本。
  • 正如其他评论提到的,您的问题是文本。 .exe 不是下一个文件。这是二进制数据。

标签: c# .net sockets sendfile


【解决方案1】:

这就是问题所在:

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

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

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

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

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

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

【讨论】:

猜你喜欢
  • 2022-08-19
  • 2017-12-26
  • 2011-02-14
  • 2011-08-23
  • 2015-06-10
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多