2 boxsoldier BOXsoldier 于 2014.11.25 10:58 提问

linux socket can通信,接收端收到的帧包乱序问题,急!

linux socket can通信,接收端收到的帧包乱序问题,急!

CAN网络设计为1个主机(linux平台)8个从机(STM32裸跑),目前在主机上遇到一个偶尔出现的问题:主机在应用层收到从机发来的CAN帧有乱序的情况(只是帧乱序,每个帧内的字节没有乱序)。

举个例子:假设某个从机先发A、再发B这个两个帧,主机在应用层调用read函数却是先读到B帧、再读到A帧。
已经排查过的结论:
1、从机发送出来的帧没有乱序。
2、由于linux下CAN设备被封装为网络设备,驱动层就是标准的网络设备驱动的写法:在接受函数中把收到的can数据填进struct sk_buff *skb,然后调用netif_rx(skb)通知内核已经接收到包。已经确认在调用netif_rx(skb)之前也没有乱序。
3、主机应用程序代码中对CAN设备的访问不存在竞争。

由上面分析,CAN数据是应该是在内核中被调乱了顺序。但是本人对内核和网络协议不熟悉,本来想跟着看看内核代码弄清楚数据是怎么一层层传递到应用层的,结果看了两天内核代码,晕头转向,能力有限又急着定位,希望有朋友能帮忙分析一下,非常感谢。

1个回答

91program
91program   Ds   Rxr 2014.11.25 11:28

Socket UDP 确实存在乱序的可能,这个传输时选择网络路径相关。TCP 不会有这样的问题。

BOXsoldier
BOXsoldier s = socket(PF_CAN, SOCK_RAW, CAN_RAW); SOCK_RAW是原始套接字,应该不经过UDP
大约 3 年之前 回复
BOXsoldier
BOXsoldier 是这样打开的套接字的:
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!