通过 Linux C TCP 发送图像
Sending Image Over Linux C TCP
我正在尝试使用纯 C 语言编写的简单 HTTP 服务器来维持来自浏览器的持久连接。
对任何 HTML/text 的响应都很好,但我在发送图像文件时遇到问题。我已经意识到 header(即因为 content-length
)在浏览器连接时是强制性的。因此,我先发送 header,然后再发送图像。服务器代码是这样的:
// section relating to responding an image
else if(!strncmp(buf, "GET /testpic.jpg", 16)) {
FILE * _fdimg = fopen("testpic.jpg", "rb");
struct stat st;
stat("testpic.jpg", &st);
char send_buffer[100000];
int read_size = fread(send_buffer, 1, st.st_size , _fdimg);
// regradless of the third param, the read_size value is 50029 which is the correct size of the image
// header_image is a char[] corresponding to appropriate headers with correct content-length
write(socket, header_img, sizeof(header_img));
write(socket, send_buffer, st.st_size);
// This works, but I can't send the header with this function.
// sendfile(socket, _fdimg, NULL, 600000);
}
现在浏览器会理解持久连接,将从套接字中获取正确数量的数据,但是通过套接字发送的文件有一个小问题,它的开头有一个额外的 00(十六进制)格式)
有什么建议吗?
注意:我也试过用正常的write()
发送header和用sendfile()
系统调用发送图像,但是浏览器会无法正确识别,页面中的微调器将继续加载
注意:图像大小为50028字节。 st.st_size 和 read_size 值都是正确的并且等于实际文件大小。我认为从文件中读取的过程没问题,但是当我将它复制到缓冲区时出现索引不匹配或某种错误。
更新 Headers :
char header_img[]=
"HTTP/1.1 200 OK\r\n"
"Connection: keep-alive\r\n"
"Content-Type:image/jpg\r\n"
"Content-Length: 50029\r\n\r\n";
您没有说明如何创建 header,但您必须知道在 C 中,字符串以 0x00
结尾:
header-field: value\n[=10=]x00
您可能不会发送
header-field: value\nIMAGEDATA
但是
header-field: value\n[=12=]x00IMAGEDATA
因为您发送了整个字符串,而不仅仅是实际的 non-terminator 个字符。
我正在尝试使用纯 C 语言编写的简单 HTTP 服务器来维持来自浏览器的持久连接。
对任何 HTML/text 的响应都很好,但我在发送图像文件时遇到问题。我已经意识到 header(即因为 content-length
)在浏览器连接时是强制性的。因此,我先发送 header,然后再发送图像。服务器代码是这样的:
// section relating to responding an image
else if(!strncmp(buf, "GET /testpic.jpg", 16)) {
FILE * _fdimg = fopen("testpic.jpg", "rb");
struct stat st;
stat("testpic.jpg", &st);
char send_buffer[100000];
int read_size = fread(send_buffer, 1, st.st_size , _fdimg);
// regradless of the third param, the read_size value is 50029 which is the correct size of the image
// header_image is a char[] corresponding to appropriate headers with correct content-length
write(socket, header_img, sizeof(header_img));
write(socket, send_buffer, st.st_size);
// This works, but I can't send the header with this function.
// sendfile(socket, _fdimg, NULL, 600000);
}
现在浏览器会理解持久连接,将从套接字中获取正确数量的数据,但是通过套接字发送的文件有一个小问题,它的开头有一个额外的 00(十六进制)格式)
有什么建议吗?
注意:我也试过用正常的write()
发送header和用sendfile()
系统调用发送图像,但是浏览器会无法正确识别,页面中的微调器将继续加载
注意:图像大小为50028字节。 st.st_size 和 read_size 值都是正确的并且等于实际文件大小。我认为从文件中读取的过程没问题,但是当我将它复制到缓冲区时出现索引不匹配或某种错误。
更新 Headers :
char header_img[]=
"HTTP/1.1 200 OK\r\n"
"Connection: keep-alive\r\n"
"Content-Type:image/jpg\r\n"
"Content-Length: 50029\r\n\r\n";
您没有说明如何创建 header,但您必须知道在 C 中,字符串以 0x00
结尾:
header-field: value\n[=10=]x00
您可能不会发送
header-field: value\nIMAGEDATA
但是
header-field: value\n[=12=]x00IMAGEDATA
因为您发送了整个字符串,而不仅仅是实际的 non-terminator 个字符。