【发布时间】: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