首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在bind()之后更改canbus套接字上的掩码?

是否可以在bind()之后更改canbus套接字上的掩码?
EN

Stack Overflow用户
提问于 2022-08-30 12:08:43
回答 1查看 49关注 0票数 0

,我看到了一个类似的 问题 ,但它没有回答我的问题。

我在我的程序中使用了canbus通信和一个mask,下面是一个从罐用获取的例子

代码语言:javascript
运行
复制
struct can_filter {
    canid_t can_id;
    canid_t can_mask;
};

struct can_filter *rfilter;
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FILTER, rfilter, numfilter * sizeof(struct can_filter));

/* try to switch the socket into CAN FD mode */
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on));

bind(s[i], (struct sockaddr *) &addr, sizeof(addr))

。。。

代码语言:javascript
运行
复制
int ret = select(s[currmax - 1] + 1, &rdfs, NULL, NULL, timeout);
int nbytes = recvmsg(s[i], &msg, 0);

在这个例子中,我设置了mask和than bind,所以每次我将receive来自socket的消息时,都会使用相同的mask

是否可以在bind之后和receive之前更改receive

示例:

代码语言:javascript
运行
复制
/* try to switch the socket into CAN FD mode */
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FD_FRAMES, &canfd_on, sizeof(canfd_on));

bind(s[i], (struct sockaddr *) &addr, sizeof(addr))

。。。

代码语言:javascript
运行
复制
setsockopt(s[i], SOL_CAN_RAW, CAN_RAW_FILTER, rfilter, numfilter * sizeof(struct can_filter));
int ret = select(s[currmax - 1] + 1, &rdfs, NULL, NULL, timeout);
int nbytes = recvmsg(s[i], &msg, 0);
EN

回答 1

Stack Overflow用户

发布于 2022-08-30 14:53:40

谢谢@RamyLebeau的SocketCAN推荐

从文件中:

带有can_filters (SOCK_RAW)的原始协议套接字 使用CAN_RAW套接字与常用的套接字具有广泛的可比性。 对CAN字符设备的已知访问。去迎接新的可能性 多用户SocketCAN方法提供的一些合理的 默认设置为原始套接字绑定时间:

  • 过滤器被设置为一个接收所有内容的过滤器。
  • 套接字只接收有效的数据帧(=>没有错误消息帧)
  • 已启用发送CAN帧的回送(见第3.2章)
  • 套接字不接收自己发送的帧(在回送模式下)

These default settings may be changed before or after binding the socket

我可以在mask之前或之后更改bindingsocket和每个can消息receive之前。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73542227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档