epoll才刚刚是服务器开发的开始,绝不是问题的最终解决

前言

终于到了epoll,我以为,从多进程服务器、多线程服务器、select服务器、poll服务器、最后到epoll就是结束了。但不是这样的,提出我这阶段开发服务器的问题,希望和大家交流交流。

问题1

当我做完一个epoll+http解析协议的项目时,我发现,如果回发的数据过大,比如一个4m的图片,浏览器收到的图片会是乱的,这个怎么解决啊。
我找到的两种方法:

  1. 增大发送缓冲区setsockopt(cfd,SOL_SOCKET,SO_SNDBUF,(char *)&ns,sizeof(ns));,还尝试了增大自己定义的转发buf;
  2. EAGAIN下设置sleep,给浏览器接收缓冲区的时间,测试了都不行;
  3. 然后我通过修改文件读写偏移量的方式重新读文件的数据写到cfd,这种方法也不行。
    这仍然是我疑惑的一个问题,你可以慢,但是乱就不对了。

问题2

服务器使用epoll,监听到好几个cfd读事件,进入for循环一个个处理cfd,如果第一个cfd1在回传一个很大的数据,是不是后面的cfd都会卡着等待,反映在浏览器端就是一直转圈?这是不是说明,epoll解决了多线程服务器创建销毁线程的资源开销,但变的不并行,在实际用需要高并发仍需要多线程的配合?不是说高并发吗,我建立新的怎么就卡着了呢?原因就是epoll程序仍然是串行的,在传输小数据,比如就几个字符的时候,很快就传了,感觉不到程序的卡顿,但大文件就会卡在传输那里,其他的cfd得不到及时的处理。这个时候我才意识到,epoll不是问题的最终解决。
这个解决就是,epoll一般配合线程池用,epoll监听到事件直接甩给处理线程,然后继续监听。所以实际用的时候必须配合多线程,不然事件会饿死。

再说点啥

本来题目是要讲解epoll,只能改下题目了,这节是想到什么就写的,排版有点乱,心乱罢了,哈哈哈哈哈。
下一步要做的就是:基于 Reactor 模型的线程池+epoll服务器解析http协议,先做到这吧,再往下比如还可以加个日志系统,加上数据库等等,还有什么技能点可以加呢,实在不清楚项目要做到什么样的复杂程度,这确实是现阶段最大的困惑。
身边走c++技术栈的人极少,也没什么参考。想找个日常实习了,总觉得还需要简历上有个服务器的项目,刚研一,也没有比赛经历,所以担心简历显的空。一想到明年的现在就是要往出拿东西找工作的时候了,就有点焦虑,不确定接下来要学点什么。大家都在说大环境互联网越来越难,一刷到的就是成百上千的力扣,各种复杂技能点加持的项目,要么就是大奖傍身,我拿捏不到我应该要学到什么程度?基础原理这些就理解着硬背吗?路漫漫其修远兮,我还要再学点什么呢?

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值