0

刚才我通过连接编写HTML内容没有问题。

    sprintf(toreturn, "%s\r\n%s\r\n%s\r\n\r\n%s", "HTTP/1.1 200 OK", "Content-Type: text/html", "Connection: close",htmlstring);
    write(*inputfd, toreturn, strlen(toreturn))

哪个工作正常。但这就是我试图传递图像以响应图像请求的原因。在这种情况下,它适用于.ico文件,但我的问题代表任何二进制文件。

    FILE *writefile = (FILE *)calloc(1,sizeof(FILE));
    char *charptr = inputaddress;
    charptr++;
    writefile=fopen(charptr,"r");

    sprintf(toreturn, "%s\r\n%s\r\n%s\r\n\r\n", "HTTP/1.1 200 OK", "Content-Type: image/vnd.microsoft.icon", "Connection: close");
    write(*inputfd, toreturn, strlen(toreturn))
    write(*inputfd, *writefile, strlen(toreturn)
    close(*inputfd);
    fclose (writefile);

这是行不通的。如何write()在 C 中通过 HTTP 生成图像(或任何二进制文件)文件?

4

3 回答 3

3

处理二进制数据时不能使用 C 字符串函数。C 字符串以 0 字节结尾,因此strlen()在任何可能包含二进制数据的字符串上使用都将返回截断的结果。

此外,您不能使用'*'运算符来获取文件的内容。此外,您不应该将FILE*函数(fopen/fclose/fread/fwrite)与常规函数(open/close/read/write)混合使用,并且使用sprintf()通常会带来麻烦 - 更安全的替代方法是snprintf().

至于你必须做什么才能让它工作,你应该open()阅读图标,然后使用该read()函数在循环中获取缓冲区的数据,直到返回小于0的值。可能会找到一个例子这里:http ://www.java-samples.com/showtutorial.php?tutorialid=569

于 2013-02-07T17:00:46.053 回答
3

两个问题:

  1. 您必须在 HTTP 标头中输出内容长度标头。

  2. Writefile 不是您图像的数据,您的代码所做的只是将文件描述符的内容输出到客户端。

正确的顺序应该是这样的

  1. 打开图标文件。
  2. 查询图标文件长度
  3. 创建 HTTP 标头,方法与现在相同,但也包括 Content-Length 标头。
  4. 将文件内容读入缓冲区
  5. 将内容输出到输出套接字。

注意,对于大文件,第 4 步和第 5 步必须写在循环中,否则会浪费内存。

于 2013-02-07T17:02:00.163 回答
0

那么,您认为这段代码的作用是什么?

writefile=fopen(charptr,"r");
...
write(*inputfd, *writefile, strlen(toreturn)

如果您说“写入writefile引用的文件的内容”,那inputfd您就错了。

write获取一个包含您要写入的实际数据的缓冲区,并要求您指定要写入的字节数。您正在向它传递一个(这不是函数期望或需要的)并要求它写入与标题一样多的字节。FILE

坦率地说,我很惊讶这甚至可以编译......

尝试打开您想要的文件,找出大小,分配适当大小的缓冲区,将内容读入所述缓冲区,关闭文件,然后将整个缓冲区发送给客户端。

于 2013-02-07T16:55:17.313 回答