我正在创建自己的简单网络服务器,我已经完成了文本文件和html文件的发送,但是当我尝试发送图像时,我遇到了一些问题,我无法弄明白。
这就是我所拥有的。我知道一次发送一个字节是低效的,但它是用于测试的。
char buffer[1];
send_header(new_fd, get_file_type(file_location));
ifstream file;
file.open(temp.c_str(), ios::out | ios::binary);
while (file.good())
{
file.read(buffer, sizeof(buffer));
send(new_fd, buffer, strlen(buffer), 0);
}
有什么想法吗?在发送之前,是否需要将其转换为网络字节顺序?
谢谢!
答案 0 :(得分:6)
strlen(buffer)
将计入第一个空字符('\0'
),这是图像数据中非常常见的字节。相反,您需要确定实际读取的字节数(ifstream.read()
不提供此信息),并使用它代替strlen
调用。
编辑:您可以使用ifstream.gcount()
获取此信息 - 所以只需将strlen
来电替换为file.gcount()
,一切都应该神奇地发挥作用。
答案 1 :(得分:6)
@cdhowie关于strlen()
是罪魁祸首。但是,如果您真的想要“现代”,请考虑使用sendfile()
。它将mmap()
您要为您发送的文件。
使用sendfile()
会阻止您将文件读入临时内存,只会将其发送给其他收件人。它不仅可以节省步骤,还可以减少真正大文件(例如图像)的页面错误。