业务需求,需要本地起个服务器和浏览器进行通信,http服务会有跨域的问题,好心塞,然后又花了差不多一周时间去整这个https,大佬给我推荐了Mongoose,花了点时间去弄这个东东。
- Mongoose下载地址: Mongoose
- Demo:Simplest_web_server_ssl
Demo里面很贴心的准备了程序用到的证书和密钥,以及浏览器需要安装的证书,如果需要用自己的自签证书,用OpenSSL制作过程打算下一个帖子来写。
Demo是用来展示程序目录下的文件系统,如果需要实现自己的功能,重写消息处理函数即可。
static void ev_handler(struct mg_connection *nc, int ev, void *p) {
if (ev == MG_EV_HTTP_REQUEST) {
mg_serve_http(nc, (struct http_message *) p, s_http_server_opts);
}
}
事件类型看了下他的宏定义,有好多,你可以根据业务场景的需要选择响应不同事件,我这里就直接用MG_EV_HTTP_REQUEST。
服务端发送应答消息最后用到的函数还是mg_send(),所以只需要这一个就够了,需要发送哪些内容就得了解一下http报文结构,响应报文主要有3部分:
- 起始行:“HTTP/1.1 200 OK\r\n”
- 首部:“Content-Type:text/html\r\nAccess-Control-Allow-Origin: *\r\nContent-Length:17\r\n\r\n”
- 主体:“This is a Test!!!”
注意首部和主体部分有一个空行,所以首部结尾是"\r\n\r\n",调用mg_send()方法,但我分了两次调用,将起始行和首部封装在一起了,除了Content-Length会因为返回内容的长度而进行修改,所以我基本上就写死了,直接上代码吧:(PS:首部内容可以找前端了解一下,让他给一套标准,不过我感觉上面4个基本就够了,需要其他得可以根据业务添加)
std::string sHeader, sContent;
//...省略部分代码
mg_send(nc, sHeader.c_str(), sHeader.length());//头部信息
mg_send(nc, sContent.c_str(), sContent.length());//返回数据内容
刚开始写帖子,写的有点low,有什么好的建议可以私信我或者直接在下方评论。