在发送消息后,我正在等待MSG_CONFIRM。如何正确接收MSG_FLAGS?我不明白为什么temp总是相等的-1。
struct msghdr msg;
struct sockaddr_can addr;
struct can_frame frame;
struct ifreq ifrsetsockopt(s, SOL_CAN_RAW, CAN_RAW_ERR_FILTER, &(int){ 1 }, sizeof(int));
setsockopt(s, SOL_CAN_RAW, CAN_RAW_LOOPBACK, &(int){ 1 }, sizeof(int));
setsockopt(s, SOL_CAN_RAW, CAN_RAW_RECV_OWN_MSGS, &(int){ 1 }, sizeof(int));
strcpy(ifr.ifr_name, ifname);
ioctl(s, SIOCGIFINDEX, &ifr);
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
write(s, &frame, sizeof(struct can_frame));
temp = recvmsg(s, &msg, MSG_CONFIRM);
printf("%02X \n", temp);
printf("%02X \n", errno);
if (msg.msg_flags==MSG_CONFIRM){
printf("MSG_CONFIRM"); }发布于 2020-11-30 16:06:25
如果CAN帧是发送确认文件,则MSG_CONFIRM由recvmsg()在msg.msg_flags中设置,但不能将标志传递给recvmsg()。
不幸的是,这使得处理发送确认有点复杂。在write()之后,您可以首先从其他节点接收CAN帧,您必须处理或缓冲这些节点,然后才能接收到与write()相对应的MSG_CONFIRM帧。您不能使用recvmsg()来等待确认,并将其他帧保存在内核缓冲区中,
https://stackoverflow.com/questions/65073910
复制相似问题