通信架构及锁重构,解决coredump--Apple的学习笔记

诊断系统Linux Server端架构验证--Apple的学习笔记中我列出了5个后续要做的任务,现在已经完成了。新的通信架构验证通过。之前架构的主要问题,就是真实的断线后没有重连。这一把联调是有收获的,故此写下小结。

当前功能:

心跳包处理方案改成了client每隔3s周期发送,server收到则回复一帧心跳(若server此时要发送诊断的回复报文,则跳过一帧心跳)。client在15s内没有收到server发来的任一报文,则关闭socket重连。server端接收超时设置为20s。
实际的断线重连,以及client重连超时后,直接关闭GUI界面退出。server端会关闭与客户端的连接,然后等待新的连接。【其实线断开了,不是完整的关闭,因为client没有回复ack,通过netstat -atp查看,处于FIN_WAIT状态,和协议描述一致,需要2分钟】

一,之前待查任务--已解决

1.python如何正确解析socket的信息格式。resp数据有3DUF乱码。

答:解决方案就是按list一个个取出,然后转为hex。并且每个hex中间添加空格。

            ret = self.s.recv(1024)  # 10
            for i in ret:
                print(hex(i), end=' ')
            print(" ")

2.server端代码需要改成c++11风格。然后确认bb-black开发板是否支持c++11交叉编译工具链。

答:之后改代码,先验证了bb-black arm编译通过,并且效果和在ubuntu上一样。验证通过。


image.png

3.关于锁的应用需要重新设计下

答:client的send函数分布在2个线程中,需要加互斥锁。另外,由于sokect关闭时候send的异常中需要解锁,否则重连后client无法send。
server的send放在同一个线程中,优先回复诊断响应而非回复心跳包。server的锁主要用于接收后设置recv flag,对应的send回复前清recv flag也要上锁。

4. 断线重连要再验证下

答:按原架构,server周期发送心跳,结果断线后send函数不阻塞,后来想起来send只是开辟空间,填充数据,除非填满(什么情况下才填满,暂时没有深入,之后可以详细查询),所以我先认为,不能依靠send来识别断线。只能通过recv来识别断线。
所以重构为client周期发送心跳,server收到心跳后回复一帧。

5.再确认下是否需要用select模式

答:上一个问题已经说明需要用recv来识别断线。recv不能用阻塞的原因是若断线了,recv就一直阻塞,没有办法退出,所以必须要用select了。server端设置了20s。python client端的重连还是检查接收2帧报文的时间超过15s则重连。(python连接函数它自己默认设置了timeout,当然我也可以设置)

二,过程中发现的问题--已解决

1. linux的recv select超时后发生了coredump。

答:原来是buffer数组的长度之前设置为12,后来recv中buffer长度设置为21导致栈溢出,所以函数返回地址被破坏,没法执行return 0。
调试步骤:
a. ulimit -c unlimited
b. gdb ./myDiag core
c. bt full
通过信息看到最后一句出现在437行,就是关闭socket通信后的return 0语句,同时发现buffer的长度不对。

那么一下子想明白了。一定是栈溢出了。原因就是返回地址被buffer溢出的内容覆盖了。栈空间的增长方向是高地址向低地址增长。但是向buffer copy赋值低地址像高地址增长。所以就把epb返回地址覆盖了。导致coredump。
一开始bt full居然没调试信息,后来我在子文件夹的一个cmake文件中也添加了set(CMAKE_BUILD_TYPE "Debug")后,所有调试信息都出来了。

关于栈的详细内容可以参考我之前的blog:Vscode汇编调试出栈入栈—Apple的学习笔记

image.png

2. python client重连超时后,sys.exit(0)后GUI界面无法退出

之前我用的都是sys.exit(0),后来查了由于我现在是python多线程,所以thread.exit和它冲突了。此种情况下要退出shell,使用os._exit(0)可以关闭python进程中所有线程。

三,新架构功能测试通过

image.png

四,添加socketCAN后在arm开发板上验证通过

1.修改send的传输请求数据
2.添加socketCAN线程及server端转发8byte报文内容到socketCAN,等待socketCAN的响应报文后再转发回client端。
3.修改TC275接收721,发送729.
通过命令启动can0,查看can0是否处于normal,启动arm端调试程序,开启candump作为后台CAN报文收发监控。
ip link set can0 type can bitrate 500000
ip link set can0 up
devmem2 0x481d0000
candump can0 &
./myDiag
验证通过截图


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343