【问题标题】:C# socket programming problem [receive file has a different hash]C#socket编程问题【接收文件有不同的hash】
【发布时间】:2011-06-20 22:53:51
【问题描述】:

我有一个套接字程序,它将 文件socket 客户端 发送到 socket 服务器 并在服务器上创建文件

将文件发送到服务器没有问题... [未损坏]

但是,

我是我的代码:(服务器监听和接收数据)

this.buffer = new byte[1000000];
 this.DataSocket.Receive(this.buffer, this.buffer.Length, SocketFlags.None);

所以总是1000000字节从客户端接收到服务器,服务器中创建的文件总是有一个固定大小的值..也比原来的大文件。

最模糊的是文件MD5 哈希值不同...因为我认为这个固定缓冲区

我的问题是我如何无法使用相同的MD5 Hash 将文件发送到 服务器

【问题讨论】:

  • Receive() 应该将接收到的字节长度返回给您。使用它来截断您正在存储的文件,或使用循环继续读取,直到返回 EOF(或 EOS)。
  • 好吧,让我们从this.DataSocket是什么数据类型开始。
  • 太好了;)会检查并回来

标签: c# sockets


【解决方案1】:

没有必要对缓冲区发疯,您可以分段阅读。您还可以使用MemoryStream 来保存所有收集到的信息,同时接收这些信息:

MemoryStream MemStream = new MemoryStream();
this.buffer = new byte[1024];

int BytesRead = this.DataSocket.Receive(this.buffer, this.buffer.Length, SocketFlags.None);
while (BytesRead > 0)
{
  MemStream.Write(this.buffer, 0, this.buffer.Length);
  BytesRead = this.DataSocket.Receive(this.buffer, this.buffer.Length, SocketFlags.None);
}

【讨论】:

    【解决方案2】:

    我认为这可能是因为 MD5 是从您创建的整个缓冲区开始创建的。如果数据只有 50000 字节长但缓冲区为 1000000,我假设这些会创建不同的哈希值。

    如果我没记错的话,receive 方法会返回一个 int,它应该是您收到的数据的大小。您可以创建一个新的字节数组并将接收到的数据复制到一个与原始文件大小完全相同的数组中。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 1970-01-01
      • 2011-07-31
      • 2011-02-02
      • 2014-10-06
      相关资源
      最近更新 更多