一点点总结

简介: 前段时间工作中遇到一些花了一些时间解决了,把整个过程以及思考简单总结一下,希望对你有些许帮助。具体事项:调试板子和pc端http通信

问题1:如何实现?


  • pc 端用 Qt 写的,但是 Qt 不带 http server


  • 设备端需要http client


解决思路:


  • 重复造轮子,自己裸写一个


  • 或者引入第三方开源库


最终决定后者,c 语言的关于http 开源库非常多,这里不多介绍。适用于Qt 的http server 前文有提到,使用的是tufao 直接迁移到Qt 中,很方便。


你以为这样就完了,那就没有这篇文章的必要了。


问题2:为什么在进行大数据比如图片或者二进制传输时,会出现接收不全?



image.png


经过阅读 tufao 源码并调试,终于让我看到以下说明:当一个http request完成后会发送end 信号。


image.png


改正后处理策略如下(参考  sunyongsunyong博客):将请求结构处理放在end 信号关联的槽函数上,这样就能保证数据的完整性。


image.png


一切看似ok了,某一天,突然要增加 http 1.1 支持,同时要支持chunked 传输,新的问题又来了。


问题3:为什么 改为http 1.1 后设备端 response 会失败?


  • 服务器问题 response 数据格式不对;


  • 客户端问题,接收response失败,或者解析失败;


经过调试以及抓包分析发现,Qt 端 http server response 时 http header 带有 chunked 属性,所以body 数据 格式也变了。


image.png


接着开始debug 设备端,发现 recv data ok,但是解析失败了。


image.png


这个时候问题已经明朗了,传输没有问题,问题出在解析上,在某个环节出问题了,这个时候就不得不怀疑用的库了?


于是乎在研究 http 1.1 chunked 协议传输后,并阅读源码发现,chunked_length计算有误。chunked data 的长度 是以16进制字符串形式写进去的。如图是我修改后的,原来按照10进制计算的(这里猜测是作者笔误)


image.png


基本的 http 1.1 传输调通了,不过当我进行 POST 请求 通过chunked 发送时,新的问题又来了?


问题4:我需要自己打包好 chunked 的数据包格式?


对于你个开源库,最理想的情况就是屏敝各种细节,用户只需要输入,输出就行。显然,我用的这个就没有,找到 sample 一看,果然如此。


image.png


结合自己研究http 1.1 chunked 的数据包后,自己手动封装了一个数据打包函数,这样通信就ok了。另人欣慰的是上位机的库做的比较好,无需改动,就可兼容http 1.0/1.1的数据接收。


过了一段时间,新的问题又来了。在一台C# 开发上位机上通信失败了。


问题5:http 1.1 为什么会报 400 error ?


经过一番搜索,让我看到以下说明,大致意思是,http 1.1请求必须包含 HOST 信息。

同时通过 postman 验证,去掉和加上HOST 测试发现果真如此。于是加上 HOST ip 和端口号就ok了。


image.png


有一点没想通的是,不知道为何,Qt 上面没有加也通信ok?


总结:


  • 需不需要重复造轮子?我觉得要有造轮子的能力,但是不一定要造;


  • 要有研究精神,敢于去看源码,不能只停留在会用层面,这样遇到问题就会退缩;


  • 要大胆怀疑,就算是大神写的东西也有可能疏忽,源码不一定都是对的;


  • 适当的时候还是需要了解技术细节的,小小的调试,暴露太多问题,技术细节只有在遇到困难是才能体现出来;


  • 第三方库做的越优秀,对技术细节屏蔽越厉害,你上手就越快,但是弊端也很明显,时间久了,出问题了自己就不知道如何解决。


  • 比较喜欢Linus Torvalds 的 一句名言:Read The Fucking Source Code(RTFSC),大不了阅读源码罢


参考链接:


https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Host


https://blog.csdn.net/sunyongsunyong/article/details/79308882

相关文章
|
5月前
|
Python
发现一篇好有意思的文章!
该文档介绍了Python中基本操作的使用方法,包括求绝对值、不同进制间的转换、整数与ASCII码之间的转换等基础功能。例如,通过`abs()`函数可以求得数字的绝对值,
109 4
|
6月前
|
存储 算法 Java
【干货】如何写一篇还算凑活的博客文章
本文从程序员的角度出发,分享了作者参加掘金启航计划并获得奖品的经历,通过实际写作流程,详细介绍了构思、撰写、美化文章及发布到各大平台的技巧与心得,旨在激发博友们的写作热情。文中还推荐了一些实用的辅助工具和博客平台。
60 0
【干货】如何写一篇还算凑活的博客文章
|
9月前
|
缓存 前端开发 搜索推荐
博客有点丑,魔改优化来一波🛠️
博客有点丑,魔改优化来一波🛠️
139 1
|
JavaScript 关系型数据库 MySQL
网站 | 懒了很久的博客(基础版)
在好久好久以前,就在写个人博客,那个时候的域名也还是现在这个,但是用的是hexo,局限性有不少。于是打算自己开始瞎弄一个自己的博客网站,太懒了,以至于现在才写了基础的版本。😭
|
机器学习/深度学习 移动开发 前端开发
想加入大厂?看这篇文章也许会帮助到你
相信加入互联网大厂是每个程序员梦寐以求的事情,无论是从工作环境、员工福利,或者说是技术氛围以及接触到的人所给你带来的一些好的机遇,都是值得我们去追求的,因此程序员可以在职业生涯初期、或者在整个职业生涯中加入过大厂,无论对自己的履历还是阅历都是很有帮助的一件事。
121 0
想加入大厂?看这篇文章也许会帮助到你
|
前端开发 JavaScript
当下做前端开发,不算简单,这篇文章可以让少走很多弯路以及需要掌握的知识
当下做前端开发,不算简单,这篇文章可以让少走很多弯路以及需要掌握的知识
|
程序员
为什么优秀的程序员都写博客?谈谈我都是如何写作的
我的文章上热榜啦 首先在写之前给大家分享个歌单1 ,歌单二,分享歌单呢,主要是我在哔哩哔哩剪辑视频加的,我写东西不会去听音乐的,因为觉得那样,不利于 我的思维扩展。
125 0
为什么优秀的程序员都写博客?谈谈我都是如何写作的
|
存储 Windows
明明很努力的写博客,为啥没人看?试试这些方法和工具(建议收藏)
明明很努力的写博客,为啥没人看?试试这些方法和工具(建议收藏)
293 0
明明很努力的写博客,为啥没人看?试试这些方法和工具(建议收藏)