我正在编写一个应用程序,它应该通过Socket CAN访问CAN总线。 我找到了这个指南(Linux Kernel CAN),并查看了this页面上的示例。
第二页上的示例是有效的,除了它们使用我的应用程序不需要的阻塞调用。 第一个会更好,但只使用这些例子也不行。
在git diff视图中,我分析了这些差异并且遇到了这些问题:
FD_ZERO(&rdfs);
FD_SET(baseSocket, &rdfs);
if(FD_ISSET(baseSocket, &rdfs))
{
int idx;
/* these settings may be modified by recvmsg() */
iov.iov_len = sizeof(frame);
msg.msg_namelen = sizeof(addr);
msg.msg_controllen = sizeof(ctrlmsg);
msg.msg_flags = 0;
recvmsg(baseSocket, &msg, MSG_DONTWAIT);
for (cmsg = CMSG_FIRSTHDR(&msg);
cmsg && (cmsg->cmsg_level == SOL_SOCKET);
cmsg = CMSG_NXTHDR(&msg,cmsg)) {
}
// ... use &frame variable
wheras我试图使用以下代码:
nbytes = read(baseSocket, &frame, sizeof(struct can_frame));
根据kernel.org论文应该足够了。
有人可以解释一下上面代码中recvmsg()
周围的东西是做什么的吗?也许这会帮助我理解为什么第一个工作正常而第二个工作没有。