Linux Reactor网络模型与高效http静态服务器构建
sendfile()说明
在HTTP服务器中,返回资源文件时可以使用sendfile函数来发送body部分,提高效率。 函数原型:
代码语言:javascript
AI代码解释
#include <sys/sendfile.h>
ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);
说明: sendfile在一个文件描述符和另一个文件描述符之间复制数据。由于这种复制是在内核中完成的,因此sendfile比读和写的组合更有效,后者需要在用户空间之间传输数据。 参数说明:
|
参数 |
含义 |
|---|---|
|
out_fd |
为读取而打开的文件描述符,通常是文件的fd |
|
in_fd |
为写入而打开的文件描述符 |
|
out_fd |
如果offset不为NULL,则它指向保存文件偏移量的变量,将从该变量开始从infd读取数据。如果偏移量为NULL,则从当前文件偏移量开始从in fd读取数据,并通过调用更新文件偏移量。 |
|
count |
在文件描述符之间复制的字节数 |
返回值: 如果传输成功,则返回写入out_ fd的字节数。请注意,成功调用sendfile()可能会写入比请求更少的字节;如果存在未发送的字节,调用方应准备重试调用。传输失败返回负数。
错误代码:
|
错误码 |
含义 |
|---|---|
|
EAGAIN |
已使用ONONBLOCK选择非阻塞I/O,sendfile需要写入阻塞。 |
|
EBADF |
未打开输入文件进行读取,或未打开输出文件进行写入。 |
|
EFAULT |
地址不正确。 |
|
EINVAL |
描述符无效或已锁定,或者类似mmap的操作不可用于in_fd,或者计数为负。 |
|
EINVAL |
out_ fd设置了O_APPEND。sendfile()当前不支持此操作。 |
|
EIO |
从in_ fd读取时出现未指定错误。 |
|
ENOMEM |
内存不足,无法从in_ fd读取。 |
|
EOVERFLOW |
计数太大,该操作将导致超过输入文件或输出文件的最大大小。 |
|
ESPIPE |
偏移量不为NULL,但输入文件不可搜索(2)。 |
4、HTTP常用的请求方法
|
方法 |
含义 |
|---|---|
|
GET |
获取资源 |
|
POST |
提交数据 |
|
PUT |
更新数据 |
|
DELETE |
删除数据 |
5、HTTP静态服务器
HTTP静态服务器可以基于Reactor,实现高并发,reactor的实现可参考上一篇:开启极速之旅:了解Linux网络设计中的Reactor模型与百万级并发实践
5.1 接收数据逻辑 -- recv
HTTP服务器接受请求时,不必接收完所有的数据才进行数据解析,可以读一部分数据先进行解析,再解析后面的数据。 可以按行解析,如HTTP请求时,可以先解析GET方法所在行的数据,里面就包含了请求资源的位置。

图片
5.2 发送数据逻辑 -- send
HTTP服务器返回数据和接收数据的类似,可以先发送http的头数据,再发送内容。 数据拷贝到自己的buffer,发送数据,发送完重新设置事件,设为读就绪。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)