c - 是否可以直接从文件写入套接字?

标签 c file sockets buffer

我对 Web 服务器的基本原理很感兴趣,例如 Apache 或 Nginx,所以现在我正在开发自己的服务器。

当我的服务器收到请求时,它正在搜索一个文件(例如 index.html),如果它存在 - 将所有内容读取到缓冲区(content)然后将其写入套接字。这是一个简化的代码:

int return_file(char* content, char* fullPath) {
    file = open(fullPath, O_RDONLY);
    if (file > 0) { // File was found, OK
      while ((nread = read(file, content, 2048)) > 0) {}
      close(file);
      return 200;
    }
}

问题很简单:是否可以避免使用缓冲区并将文件内容直接写入套接字?

感谢任何提示:)

最佳答案

没有可以直接从文件写入套接字的标准化系统调用。

然而,一些操作系统确实提供了这样的调用。例如,FreeBSD 和 Linux 都实现了一个名为 sendfile 的系统调用,但两个系统的具体细节有所不同。 (在这两种情况下,您都需要文件的底层文件描述符,而不是 FILE* 指针,尽管在这两种平台上您都可以使用 fileno() 来提取 fd来自 FILE*。)

更多信息:

关于c - 是否可以直接从文件写入套接字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42907709/

相关文章:

C:填充矩阵

c++ - 如何写回Parent的管道?

日历时间存储为带符号的 32 位整数 - 何时溢出

C 常量结构,在堆栈上包含不同长度的数组

python - 使用 eval 优化 Python 读取大文件

JAVA - 不可写 channel 异常

python - 使用字典查找文件中单词出现的行号

c - 在 linux 套接字中的传输时间戳数据包中接收有效负载和辅助数据

python发送http响应

sockets - TCP 阻塞套接字 - 在不同数据包中接收少量字节的可能性