马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1.构建相应
- 构建相应流程如下
- 确认方法
- 根据不同方法,以不同方法提参
- 确认访问资源
- 如果用户的URL没有指明要访问的某种资源(路径),虽然浏览器默认会添加/,但是依旧没有告知服务器,要访问什么资源
- 此时,默认返回对应服务的首页
- 这里的/不是Linux服务器的根目次,通常是http服务器设置的自己的WEB根目次
- 关于stat
- stat()返回一个文件的信息,信息都存在一个struct stat结构体变量中
- struct stat可以判断
- 判断文件是否是可实验程序
- 若不是,则走ProcessNonCgi逻辑,返回静态网页
- 如果,则走ProcessCgi逻辑,将参数传递给子程序处置惩罚
- 请求资源是什么范例,取决于资源的后缀
- 为什么要利用goto?
- 分析协议的每一步,都有大概堕落
- 所以在做堕落处置惩罚的时候,如果没有goto,会导致利用大量的if判断
2.发送相应
- 注意:
- 分多次发和把所有内容合成一个字符串一次性发送是没区别的
- send只是把内容拷贝到发送缓冲区中
- 具体什么时候发,一次性发多少,是由TCP决定的
- 此处_response.response_body发送逻辑确保了_response.response_body能全部发完
- 此次请求为ProcessNonCgi时,必要从磁盘读取文件内容,再把内容拷贝到发送缓冲区中,这样是效率低下的
- sendfile()可以在两个文件形貌符之间拷贝数据
- 即:sendfile()可以把文件内容,直接拷贝到Tcp的发送缓冲区中,进步了效率
- 这个拷贝着实内核态完成的,所以比read() / write()高效的多
- void SendResponse()
- {
- send(_sock, _response.status_line.c_str(), _response.status_line.size(), 0);
- for(auto& str : _response.response_header)
- {
- send(_sock, str.c_str(), str.size(), 0);
- }
- send(_sock, _response.blank.c_str(), _response.blank.size(), 0);
- if(_request.cgi)
- {
- const char *start = _response.response_body.c_str();
- size_t size = 0, total = 0;
- while (total < _response.response_body.size() &&
- (size = send(_sock, start + total, _response.response_body.size() - total, 0) > 0))
- {
- total += size;
- }
- }
- else
- {
- sendfile(_sock, _response.fd, nullptr, _response.fSize);
- close(_response.fd);
- }
- }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |