【问题标题】:Webserver in C++, how to send an imageC ++中的Web服务器,如何发送图像
【发布时间】:2011-05-06 23:37:21
【问题描述】:

我正在制作自己的简单网络服务器,我已经获得了可以完美发送的文本文件和 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);
}

有什么想法吗?发送前需要转换成网络字节序吗?

谢谢!

【问题讨论】:

  • 另外,如果您要坚持使用这种方法,您应该将缓冲区定义为 4096 字节。使用 1 字节缓冲区将导致大量系统调用,这将大大降低服务器速度。
  • 如果你真的想硬核,你可以手动mmap() 文件,然后同时writev() 头文件和文件。 BSD 的 sendfile() 为你做这件事; Linux 相当有限,因此您必须自己调用 mmap()/writev()。
  • @cdhowie,哈哈,我知道我在用它来测试一些东西,我把它切换到 1024,因为它甚至无法在你的解决方案中正常工作,它设置为 1。

标签: c++ linux image webserver


【解决方案1】:

strlen(buffer) 将计数到第一个空字符 ('\0'),这是图像数据中非常常见的字节。相反,您需要弄清楚实际读取了多少字节(ifstream.read() 不提供此信息)并使用它来代替您的 strlen 调用。

编辑:您可以使用ifstream.gcount() 来获取它——所以只需将您的strlen 调用替换为file.gcount(),一切都会神奇地工作。

【讨论】:

    【解决方案2】:

    @cdhowie 关于strlen() 是罪魁祸首是正确的。但是,如果您真的想变得“现代”,请考虑使用@987654321@。它将@987654322@您要为您发送的文件。

    使用sendfile() 将阻止您将文件读入临时内存,只是为了将其发送给其他收件人。它不仅节省了步骤,而且对于非常大的文件(例如图像)也减少了页面错误。

    【讨论】:

    • 酷,我总是很现代,我会去看看。
    • 我肯定也会考虑走这条路。读/写发送机制实际上应该只在您需要处理流(例如压缩/加密)时使用。
    • 或者如果其他人在 Windows 中做类似的事情,则等效的称为 TransmitFile。
    猜你喜欢
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多