【问题标题】:read() and write() non text files in chunks in CC 中的块中的 read() 和 write() 非文本文件
【发布时间】:2017-02-15 20:06:45
【问题描述】:

我有一个客户端服务器程序,在该程序中,我通过 TCP 以块的形式将文件从服务器读取到客户端。但是,并非所有发送的块都是我给出的大小。其中一些小于请求的大小甚至 1。 这是我的服务器端代码,用于读取文件并写入套接字 rd=read(filed, buffer,128);
write(socketd,buffer,128);

这仅适用于非文本文件。在使用 txt 文件时,它可以完美运行,但无法用于 pdf、ppts、图像。有没有办法分块读取这些非文本文件?

在每次迭代中读取的 pdf 文件大小示例(以字节为单位) 128 128 128 128 116 128 128 36

【问题讨论】:

  • TCP 没有消息边界。如果您需要构造消息,则必须在数据中执行此操作,而不是依赖 read() 返回与 write() 发送的相同大小。
  • 为什么它返回小于请求的大小是一个问题?只需将返回的内容复制到文件中,然后返回循环。
  • 我的read 用于读取文件内容,write 写入套接字

标签: c file unix tcp client-server


【解决方案1】:

您应该只写入实际从文件中读取的数量。如果文件的大小不是 128 的倍数,那么最后一次读取不能返回 128 字节,它只会返回文件中剩下的内容。使用rd 作为写入套接字的数量。

while ((rd = read(filed, buffer, 128)) > 0) {
    write(socketd, buffer, rd);
}

【讨论】:

  • 我已经在做这一步了。它在迭代中也没有接近结束,所以没有读取完整的块。此问题专门针对非文本文件。文本文件可以完美运行,所以我猜它可能与文件类型有关,但找不到任何说明。
  • 什么操作系统? Unix 不区分文本文件和非文本文件。
  • 我正在使用 Gentoo。因此混乱,从技术上讲,文件应该按原样阅读,没有任何这样的区别
  • 我同意,应该。但它有什么不同呢? read() 总是允许返回小于最大值,并且无论如何程序都应该正常工作。
  • 就是这样,程序做了它需要做的事情,但这只是增加了写入套接字的次数。
【解决方案2】:

问题已解决。我正在使用 strlen(buffer) 给出这些数字。根据需要,read() 返回的整数是 128。

【讨论】:

  • 这解释了为什么它似乎适用于文本文件,它们没有嵌入空字节。虽然你很幸运它没有报告大于 128 的尺寸大于,因为read() 没有添加空终止符。在内存中的缓冲区以 0 字节开始之后发生的任何事情都是偶然的。
  • 但是最后一次读取文本文件应该失败了,从文件读取的最后一部分之后的缓冲区部分应该包含上次读取的剩余内容,所以它会返回128 而不是较短的数量。
  • 您应该将原始代码放入问题中,以便显示问题所在。
猜你喜欢
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-20
  • 1970-01-01
相关资源
最近更新 更多