[英]Can I change the mask on a canbus socket after bind()?
我看到了一个类似的问题,但它没有回答我的问题。
我在我的程序中使用带有mask
的canbus
通信,这是一个来自can-utils的示例:
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))
. . .
int ret = select(s[currmax - 1] + 1, &rdfs, NULL, NULL, timeout);
int nbytes = recvmsg(s[i], &msg, 0);
在这个例子中,我设置了mask
,然后bind
,所以每次我会receive
来自socket
的消息时,它都会使用相同的mask
。
是否可以在bind
之后和receive
之前更改mask
?
例子:
/* 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))
. . .
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);
感谢@RamyLebeau 的SocketCAN 推荐。
从文档中:
带有 can_filters (SOCK_RAW) 的 RAW 协议 sockets
使用 CAN_RAW sockets 与常用的
对 CAN 字符设备的已知访问。 迎接新的可能
由多用户SocketCAN提供的方法,一些合理的
默认设置在 RAW 套接字绑定时间:
- 过滤器设置为一个过滤器接收所有内容
- 套接字只接收有效的数据帧(=> 没有错误消息帧)
- 已发送 CAN 帧的环回已启用(参见第 3.2 节)
- 套接字不接收自己发送的帧(在环回模式下)
These default settings may be changed before or after binding the socket
我can
在binding
socket
之前或之后以及在每条消息receive
之前更改mask
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.