【问题标题】:Display image from web server in C在 C 中显示来自 Web 服务器的图像
【发布时间】:2015-04-30 01:41:40
【问题描述】:

我在 C 上编写一个 Web 服务器。我可以查看 HTML 和 txt 文件,但是我无法查看图像文件。

我得到的只是一个错误“图像“http://localhost:8080/images/image.jpg”无法显示,因为它包含错误。”

    if(strstr(method, "GET") != NULL)
    {
        f = fopen(url+1, "rb");

        if(f != NULL)
        {
            strncat(response, "HTTP/1.1 200 OK\r\n", 20);

            if(strstr(url, ".html") || strstr(url, ".htm"))
            {
                strncat(response, "Content-Type: text/html\r\n\r\n", 30); 
            }

            else if(strstr(url, ".txt"))
            {
                strncat(response, "Content-Type: text/plain\r\n\r\n", 30); 
            }

            else if(strstr(url, ".jpg") || strstr(url, ".jpeg"))
            {
                strncat(response, "Content-Type: image/jpeg\r\n\r\n", 30); 
            }

            filesize = stat(url+1, &st);
        filesize = st.st_size;

        strncat(response, "Content-Length: 67210\r\n\r\n", 40); 
        while(fread(text,1 , 1, f))
        {
        strncat(response, text, filesize);
        }

printf("%d\n", strlen(text));
printf("%d\n", strlen(response));

            write(client_fd, response, strlen(response)); /*-1:'\0'*/
            fclose(f);
        }

        else
        {
            write(client_fd, not_found_response, strlen(not_found_response)); /*-1:'\0'*/
        } 
    }

    else
    {
        write(client_fd, bad_request_response, strlen(bad_request_response)); /*-1:'\0'*/
    }

    close(client_fd);
}

编辑:我已根据以下建议编辑了我的代码。但是我仍然遇到同样的问题。我检查了文件大小,它是 67210,但是当我执行 strlen(response) 时,我只得到 66882。我仍然缺少一些可能是问题吗?

【问题讨论】:

  • 您对 strncat 的使用不提供任何安全性。您不妨使用 strcat。
  • 二进制文件可能嵌入了'\0'。您不应该对二进制数据使用 string 函数。
  • jpeg 的 80 很短
  • 你必须添加一个标题,内容为 len Content-Length:XXXX

标签: c image file webserver server


【解决方案1】:

错误可能在fgets 期间悄悄出现。 fgets 对阅读文本很有用,但对二进制数据则不然。请改用fread,不要为了找到数据的大小而愚蠢地寻找到最后的技巧;只需读到最后并将数据写入响应。要获取标头文件的大小,请使用statfstat

【讨论】:

  • 感谢您的帮助,我改为使用 fread,但我仍然遇到同样的错误。 fread(文本, sizeof(文本), 1, f);.
  • 你想要fread(text, 1, sizeof(text), f)。检查返回值,它将告诉您成功读取的项目数。通过首先放置 sizeof(text),您将截断文件末尾的数据。
  • 现在我正在使用 stat 获取文件大小并将 Content-Length 添加到我的标题中,但我仍然遇到相同的错误。 fread(文本,文件大小, 1, f);是我的阅读所有内容吗?
  • 您是否进行了网络捕获以检查是否所有文件都已发送以及内容长度是否正确?
  • 我不确定如何进行网络捕获以检查我的所有文件是否都已发送,但我尝试了一个 HTML 文件并且能够显示它。是的,内容长度是正确的,我根据实际文件大小进行了检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-06
  • 1970-01-01
  • 2016-07-10
  • 2014-02-07
  • 1970-01-01
  • 2018-01-22
  • 2022-01-20
相关资源
最近更新 更多