Linux kernel SocketCAN读取套接字调用被阻止

Linux kernel SocketCAN读取套接字调用被阻止,linux-kernel,sockets,mac-address,Linux Kernel,Sockets,Mac Address,我正在尝试从CAN套接字读取套接字。我的read呼叫被阻止,无法返回外部控制 我的代码流中的步骤: 打开插座 分配接口名 分配CAN ID 分配CAN掩码 束缚 读取/接收对套接字的调用 代码如下: mSock = socket(PF_CAN,SOCK_RAW,CAN_RAW); if(mSock < 0) { std::cout << "failed to open socket\n" << std::endl; } else { std::c

我正在尝试从CAN套接字读取套接字。我的read呼叫被阻止,无法返回外部控制

我的代码流中的步骤:

  • 打开插座
  • 分配接口名
  • 分配CAN ID
  • 分配CAN掩码
  • 束缚
  • 读取/接收对套接字的调用
  • 代码如下:

    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);
    
    它是否与Hwaddr中的00相关:00-00-00。。。。。 当我的Can接口硬件出现问题时,是否会发生这种情况


    或者,如果是软件问题,在什么情况下,我的读取调用会被阻止?

    这是正常行为,在缓冲区中没有消息时发生。一旦总线中有消息,它将返回消息内容。
    如果不想等待,请使用O_非阻塞标志。

    对于全局设置在打开的文件描述中使用
    fcntl(mSock、F_SETFL、O_NONBLOCK)



    如果你只想使用每个调用选项
    recvfrom(…)
    ,那么另一方面,使用
    MSG_DONTWAIT

    你知道我的另一个查询是关于HW地址以00字符串的形式出现吗?我的嵌入式系统中有相同的HWaddr。这是注册CAN接口的常见方式,因此这是正常的。如果你认为答案对你有帮助,请不要忘记投票或接受答案。谢谢
    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