webserver面试

1 难点

1.1 网络框架的选取

常见的有reactor和proactor,在linux中,异步io不完善,所以很多项目都采用reactor模式。我又参考了开源的项目,最终选择使用同步io模拟异步的模式。

1.2 RAII

参考开源项目,资源获取即初始化,任务执行之前获取数据库连接,执行完释放连接,对这个部分

的理解和使用是个难点。

1.3 项目优化

1.3.1 堆

使用小根堆代替开源项目中的list作为定时器的容器,使添加和修改定时器的时间复杂度从O(n)降至O(logn).

涉及到的函数有:添加、修改、删除、tick、上移、下移、交换定时器

这一块需要把堆排序掌握清楚,根据需要,写出自己的代码

1.3.2 sendfile

项目使用零拷贝技术优化文件传输。调用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

1.3.3 部署云服务器

因为之前没有使用过云服务器,项目部署到云服务器上,运行,但是无法访问。查资料,发现云服务器对外开放的端口需要手动配置。配置的过程又出现了问题,花了很长时间。

2 项目介绍

基于Linux的web服务器,可响应get,post请求,响应给客户端图片和视频,实现注册功能。可实现上万并发。已经部署在云服务器上。

项目主要模块有:

        封装互斥锁、信号量

        线程池

        连接任务类

到这里,主要模块已经完成,可以实现get请求。

        定时器模块,关闭不活跃连接

        日志模块,记录运行信息、错误信息

        数据库连接模块,实现注册、登录


 

  • 8
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值