bind()之后,我可以更改canbus套接字上的掩码吗



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

我在我的程序中使用canbus通信和mask,这里有一个例子,取自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);

在这个例子中,我设置了maskbind,所以每次我将receivesocket发送消息时,它都将使用相同的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协议套接字

使用CAN_RAW套接字与通常
已知的对CAN字符设备的访问具有广泛的可比性。为了满足多用户SocketCAN方法提供的新可能性
,在RAW套接字绑定时间设置了一些合理的
默认值:

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

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

我可以在binding之前或之后、在socket之前以及在每个can消息receive之前更改mask

最新更新