我正在尝试在 fastcgi 中进行文件上传和下载。
要使用 sendfile(),我需要 Web 服务器到客户端(浏览器)的打开套接字。
fastcgi 没有把它传给我(我不认为)。
我对如何获取浏览器的套接字描述符一无所知。
我也对另一种方法持开放态度,无需重定向或打开新连接。
帮助表示赞赏
您没有在 FastCGI 中获得到浏览器的套接字。您直接获得的唯一套接字连接到 Web 服务器,它需要 FastCGI 数据帧,而不仅仅是原始数据。
文件下载最典型的解决方案是X-Sendfile 标头,它指示 Web 服务器吐出一个文件(可能使用类似sendfile()
内部的东西)而不是您的响应。它由 Lighttpd 引入,由 nginx 原生支持,并由 Apache 通过 mod_xsendfile 支持。
请记住,套接字和文件的处理方式大多相同,因此您可以使用标准输出文件描述符作为输出“套接字”而不是真正的套接字:
#include <unistd.h>
int in_fd = open(...);
sendfile(STDOUT_FILENO, in_fd, NULL, length_of_file);