常见的有reactor和proactor,在linux中,异步io不完善,所以很多项目都采用reactor模式。我又参考了开源的项目,最终选择使用同步io模拟异步的模式。
参考开源项目,资源获取即初始化,任务执行之前获取数据库连接,执行完释放连接,对这个部分
的理解和使用是个难点。
使用小根堆代替开源项目中的list作为定时器的容器,使添加和修改定时器的时间复杂度从O(n)降至O(logn).
涉及到的函数有:添加、修改、删除、tick、上移、下移、交换定时器
这一块需要把堆排序掌握清楚,根据需要,写出自己的代码
项目使用零拷贝技术优化文件传输。调用sendfile(),出现问题:
1.无法传输完整的图片
使用strerror(errno)输出错误,错误为Resource temporarily unavailable。
查询资料,这个错误表示? 正在使用一个非阻塞的套接字,但是请求的操作会阻塞。对应到项目中,就是用于通信的套接字使非阻塞的,但向套接字传输文件的操作会阻塞。
errno为EAGAIN 或 EWOULDBLOCK
解决办法:出现这个错误后,继续尝试传输
// 套接字缓冲区已满,继续尝试传输
if (errno == EAGAIN || errno == EWOULDBLOCK)
{
continue;
}
为什么会出现这个问题?
可能是因为套接字的接收缓冲区较小,默认为8K,最大可设置为8MB.
调大套接字缓冲区的大小,从而减少缓冲区满的情况,加快传输速度。但是缓冲求并非不是越大越好,套接字维护在内核中,缓冲区越大,占用资源越多,要根据情况设置一个合理的值。
2.无法传输完整视频
查看pagecache大小:
cat /proc/meminfo | grep "Cached"。
Cached: ? ? ? ? ? 205500 kB
使用strerror(errno)输出错误,错误为。Interrupted system call
表示? 执行系统调用的过程中被信号中断。
// 错误:Interrupted system call
if (errno == EINTR)
{
continue;
}
但视频传输仍会出现问题:broken pipe,尚未解决
考虑到sendfile本身也不适合传输大文件,因此,大文件使用传统的传输方式,小文件使用sendfile(),阈值为15MB
因为之前没有使用过云服务器,项目部署到云服务器上,运行,但是无法访问。查资料,发现云服务器对外开放的端口需要手动配置。配置的过程又出现了问题,花了很长时间。
基于Linux的web服务器,可响应get,post请求,响应给客户端图片和视频,实现注册功能。可实现上万并发。已经部署在云服务器上。
项目主要模块有:
? ? ? ? 封装互斥锁、信号量
? ? ? ? 线程池
? ? ? ? 连接任务类
到这里,主要模块已经完成,可以实现get请求。
????????定时器模块,关闭不活跃连接
????????日志模块,记录运行信息、错误信息
????????数据库连接模块,实现注册、登录
?