gpt4 book ai didi

c 通过套接字发送图像

转载 作者:可可西里 更新时间:2023-11-01 17:00:27 24 4
gpt4 key购买 nike

我正在制作一个简单的 http 服务器。到目前为止,套接字适用于 html 文件,现在我正在尝试制作工作图像。

这是我读取文件的方式:

char * fbuffer = 0;
long length;
FILE *f;

if ((f = fopen(file, "r")) == NULL)
{
perror("Error opening file");
exit(1);
}

fseek (f, 0, SEEK_END);
length = ftell(f);
fseek (f, 0, SEEK_SET);
fbuffer = malloc(length);
int total = 0;
if (fbuffer)
{
while (total != length)
{
total += fread(fbuffer, 1, length, f);
}
}
fclose (f);

然后我就将数据发送到套接字:

char response[20048];
snprintf(response, sizeof(response), "HTTP/1.1 200 OK\nContent-Type: %s\nContent-Length: %i\n\n%s", type, (int) strlen(fbuffer), fbuffer);
n = send(newsockfd, response, strlen(response)+1, 0);

为什么它不适用于图像?浏览器显示错误 图像“http://127.0.0.1:1050/image.gif”无法显示,因为它包含错误。 Http 响应是:

Content-Length: 7
Content-Type: image/gif

图像有 247 个字节。变量 length 和 total 的值为 247。变量 fbuffer 包含 GIF89a(+一个字符 -> 一些值为 0 0 1 0 的二进制方 block )。

我做错了什么?

谢谢。

最佳答案

这里的问题是 fbuffer 包含二进制数据,但您试图通过使用像 strlen 这样的函数并使用 % s 格式说明符来打印它。

由于二进制数据可能包含空字节,这会阻止字符串函数处理它们,因为它们使用空字节来标记字符串的结尾。

您应该改用 memcpy 之类的函数将数据放入输出缓冲区。

char response[20048];
int hlen;

hlen = snprintf(response, sizeof(response),
"HTTP/1.1 200 OK\nContent-Type: %s\nContent-Length: %d\n\n", type, length);
memcpy(response + hlen, fbuffer, length);

n = send(newsockfd, response, hlen + length, 0);

关于c 通过套接字发送图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40346286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com