SocketCAN 读取套接字调用正在阻塞
SocketCAN read socket call is blocking
我正在尝试从 CAN 套接字读取套接字。我的 read 调用被阻止并且从未 returns 控制外部。
我的代码流程中的步骤:
- 打开一个套接字
- 分配接口名称
- 分配 CAN ID
- 分配 CAN 掩码
- 绑定
- read/receive 调用套接字
代码如下:
mSock = socket(PF_CAN,SOCK_RAW,CAN_RAW);
if(mSock < 0) {
std::cout << "failed to open socket\n" << std::endl;
}
else {
std::cout << "mSock = \n" << mSock << std::endl;
}
strcpy(ifr.ifr_name,"can0");
iotlRetVal = ioctl(mSock,SIOCGIFINDEX, &ifr);
if(iotlRetVal < 0) {
std::cout << "failed to open socket\n" << std::endl;
}
else {
std::cout << "ifr.ifr_ifindex = \n" << ifr.ifr_ifindex << std::endl;
}
cfilter.can_id = 0xabcdef0;
cfilter.can_mask = CAN_EFF_MASK;
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bindRetVal = bind(mSock, (struct sockaddr *) &addr, sizeof(addr));
if(bindRetVal < 0) {
std::cout << "failed to bind socket\n" << std::endl;
}
else {
std::cout << "bindRetVal = \n" << bindRetVal << std::endl;
}
char buff[200];
int len;
int test;
test = recvfrom(mSock, &buff, sizeof(buff), 0,
(struct sockaddr *) &addr, (socklen_t *)&len);
printf("test:%d \t len:%d\n",test,len);
我观察到这个调用根本没有返回,只是被阻止了。
如果我在 Linux PC 上执行 ifconfig -a,我会看到以下内容:
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:83
是否与Hwaddr中的00s有关:00-00-00 .....
当我的 Can 接口硬件出现问题时会发生这种情况吗?
或者如果是软件问题,在什么情况下我的读取调用会被阻塞?
这是正常行为,当缓冲区中没有消息时会发生。一旦总线中有消息,它就会 return 包含消息的内容。
如果您不想等待,请使用 O_NONBLOCK 标志。
对于全局设置,在打开的文件描述中使用fcntl(mSock, F_SETFL, O_NONBLOCK)
。
如果您打算仅使用 per-call 选项 和 recvfrom(...)
,则另一方面使用 MSG_DONTWAIT
。
我正在尝试从 CAN 套接字读取套接字。我的 read 调用被阻止并且从未 returns 控制外部。
我的代码流程中的步骤:
- 打开一个套接字
- 分配接口名称
- 分配 CAN ID
- 分配 CAN 掩码
- 绑定
- read/receive 调用套接字
代码如下:
mSock = socket(PF_CAN,SOCK_RAW,CAN_RAW);
if(mSock < 0) {
std::cout << "failed to open socket\n" << std::endl;
}
else {
std::cout << "mSock = \n" << mSock << std::endl;
}
strcpy(ifr.ifr_name,"can0");
iotlRetVal = ioctl(mSock,SIOCGIFINDEX, &ifr);
if(iotlRetVal < 0) {
std::cout << "failed to open socket\n" << std::endl;
}
else {
std::cout << "ifr.ifr_ifindex = \n" << ifr.ifr_ifindex << std::endl;
}
cfilter.can_id = 0xabcdef0;
cfilter.can_mask = CAN_EFF_MASK;
addr.can_family = AF_CAN;
addr.can_ifindex = ifr.ifr_ifindex;
bindRetVal = bind(mSock, (struct sockaddr *) &addr, sizeof(addr));
if(bindRetVal < 0) {
std::cout << "failed to bind socket\n" << std::endl;
}
else {
std::cout << "bindRetVal = \n" << bindRetVal << std::endl;
}
char buff[200];
int len;
int test;
test = recvfrom(mSock, &buff, sizeof(buff), 0,
(struct sockaddr *) &addr, (socklen_t *)&len);
printf("test:%d \t len:%d\n",test,len);
我观察到这个调用根本没有返回,只是被阻止了。
如果我在 Linux PC 上执行 ifconfig -a,我会看到以下内容:
can0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
UP RUNNING NOARP MTU:16 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:83
是否与Hwaddr中的00s有关:00-00-00 ..... 当我的 Can 接口硬件出现问题时会发生这种情况吗?
或者如果是软件问题,在什么情况下我的读取调用会被阻塞?
这是正常行为,当缓冲区中没有消息时会发生。一旦总线中有消息,它就会 return 包含消息的内容。
如果您不想等待,请使用 O_NONBLOCK 标志。
对于全局设置,在打开的文件描述中使用fcntl(mSock, F_SETFL, O_NONBLOCK)
。
如果您打算仅使用 per-call 选项 和 recvfrom(...)
,则另一方面使用 MSG_DONTWAIT
。