SocketCAN读取套接字调用正在阻塞

时间:2016-04-21 13:28:33

标签: linux-kernel sockets mac-address

我正在尝试从CAN套接字读取套接字。我的阅读电话被阻止,永远不会在外面恢复控制。

我的代码流程中的步骤:

  1. 打开插座
  2. 指定接口名称
  3. 指定CAN ID
  4. 分配CAN掩码
  5. 结合
  6. 读取/接收对套接字的调用
  7. 以下是代码:

    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中的00有关:00-00-00 ..... 当我的Can接口硬件出现问题时会发生这种情况吗?

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

1 个答案:

答案 0 :(得分:2)

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

对于全局设置,请在打开的文件说明中使用fcntl(mSock, F_SETFL, O_NONBLOCK)

如果您打算仅将每次通话选项recvfrom(...)一起使用,则另一方面使用MSG_DONTWAIT