在网络分配中存在一些问题。最终目标是拥有一个C程序,通过HTTP从给定的URL抓取文件并将其写入给定的文件名。对于大多数文本文件我都能正常工作,但我遇到了一些问题,我怀疑这些问题都来自同一根本原因。未知文件类型的C文件输入/输出:文件复制
下面是我使用从网络文件描述符将数据传输到输出文件描述符的代码的快速版本:
unsigned long content_length; // extracted from HTTP header
unsigned long successfully_read = 0;
while(successfully_read != content_length)
{
char buffer[2048];
int extracted = read(connection,buffer,2048);
fprintf(output_file,buffer);
successfully_read += extracted;
}
正如我所说的,这工作对大多数的文本文件(尽管%符号会混淆fprintf,所以有办法解决这个问题会很好)。问题在于,当我尝试获取非文本文件时(.png是我正在使用的基本测试文件,但该程序需要能够处理任何内容),它会永久挂起。
我做了一些调试和我知道我不会在CONTENT_LENGTH,在读期间收到错误,或者打一些网络瓶颈。我在网上查了一下,但是我可以找到的二进制文件的所有C文件I/O代码似乎都基于这样的想法,即您知道文件中的数据是如何构建的。我不知道它的结构如何,我也不太在乎;我只想将一个文件描述符的内容复制到另一个文件描述符中。
任何人都可以指向我往一些内置的文件I/O功能,我可以打棍子投入使用为目的?
编辑:或者,有没有在HTTP标头会告诉我如何处理任何文件我正在使用一个标准的领域?
使用'fprintf中()'那样是危险的;这是一个安全漏洞,称为“格式字符串漏洞”。你可以用'fprintf中(OUTPUT_FILE“%s”,缓冲区);'如果你有信心,再也不会有NUL''在数据\ 0''字节;否则,使用'fwrite()'。 – 2012-01-29 00:40:25