需求是解析upnp协议中的http 协议 和xml 中取得响应的内容,使用c++字符串的高级特性和http协议“\r\n”的特性匹配,使用std::istringstream来获取string 类中的每一行,分而治之,对每一行字符串再进行分解,达到我们解析头部的目的,事实上,没有完美无缺的技术,各个协议都是用的组合拳,把各类协议组合而得到一个完整的解决方案,upnp协议就是组播协议套上使用http 和 xml 以及soap 等来完成发现和控制。
http协议头部示例HTTP/1.1 200 OK CACHE-CONTROL: max-age=300 DATE: Sat, 19 Jun 2021 08:10:55 GMT EXT: LOCATION: http://192.168.0.104:25826/description.xml OPT: “http://schemas.upnp.org/upnp/1/0/”; ns=0101-NLS: 1d14711e-d0b3-11eb-ba82-84a8e6833d02 SERVER: Linux/4.9.44_s5, UPnP/1.0, Portable SDK for UPnP devices/1.6.19 X-User-Agent: redsonic ST: urn:schemas-upnp-org:device:MediaRenderer:1 USN: uuid:bb5e-21ce-1111-11b2-f918-ec9c-3235-709a-::urn:schemas-upnp-org:device:MediaRenderer:1
我们需要拿到http 的版本和返回状态如 200 和 reason like “ok” 同时解析里面的每条内容,拿到每个header 的头部 行成 map的结构返回
定义数据结构typedef struct s_res
{
string httpver;
int status;
string reason;
}s_res;
事实上,对于以下 //GET /live/1001 HTTP/1.1 //HTTP/1.1 200 OK //POST /live/1001 HTTP/1.1 等我们都可以使用这种方法
下面开始解析,流程是
1 解析是否有HTTP 头部四字节
2 如果有,拿到HTTP头部后的返回状态status 和 reason
3 解析剩下的每一行,每一行都是 x :y 的结构,放入map
static s_res fetch_head_info(std::string &lines, map &hmap)
{
s_res res = {"",-1,""};
if (strncmp(lines.c_str(), "HTTP", 4) != 0)
{
//not support now
return res;
}
std::istringstream s(lines);
std::string request;
std::getline(s, request);
if (request[request.size() - 1] == '\r')
{
request.pop_back();
//request.erase(request.end() - 1);//the same with pop_back
//GET /live/1001 HTTP/1.1
//HTTP/1.1 200 OK
size_t i = 5;
size_t lmax = request.size();
while (request[++i] != ' ' && i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?