boost ::asio поверх SocketCAN

Я думал об использовании Boost Asio для чтения данных из Socket CAN . В linux/can.h ничего особенного не происходит, и устройство должно вести себя как петлевой интерфейс и использоваться с необработанным сокетом.

Глядя на интерфейс basic_raw_socket, кажется, что я могу использовать базовый _необработанный _сокет ::назначить для назначения собственного сокета, созданного с помощью

socket( PF_CAN, SOCK_RAW, CAN_RAW );

Это то, что у меня есть до сих пор

namespace can {
       class CanSocket {
       public:
               typedef boost::asio::ip::basic_endpoint endpoint;
               typedef boost::asio::ip::basic_resolver_query resolver_query;
               typedef boost::asio::ip::basic_resolver_iterator resolver_iterator;
               typedef boost::asio::basic_raw_socket socket;
               typedef boost::asio::ip::basic_resolver resolver;

               CanSocket()
                       : _protocol( CAN_RAW )
                      , _family( PF_CAN )
               {
               }

               static CanSocket v4()
               {
                       return CanSocket();
               }
               static CanSocket v6();
               int type() const;
               int protocol() const;
               int family() const;

               friend bool operator==(const CanSocket& p1, const CanSocket& p2)
               {
                       return p1._protocol != p2._protocol || p1._family != p2._family;
               }
               friend bool operator!=(const CanSocket& p1, const CanSocket& p2)
               {
                       return p1._protocol == p2._protocol || p1._family == p2._family;
               }

       private:
               int _protocol;
               int _family;
};
}

И вот как я использую его в своем приложении

   boost::asio::io_service ioserv;

   CanSocket::socket s( ioserv );

   int sock = socket( PF_CAN, SOCK_RAW, CAN_RAW );

   s.assign(CanSocket::v4(), sock);

   struct ifreq ifr;
   strcpy(ifr.ifr_name, "vcan0");
   ioctl(sock, SIOCGIFINDEX, &ifr); /* ifr.ifr_ifindex gets filled
                                 * with that device's index */

   /* Select that CAN interface, and bind the socket to it. */

   /* this should be the endpoint */
   struct sockaddr_can addr;
   addr.can_family = AF_CAN;
   addr.can_ifindex = ifr.ifr_ifindex;

   /* s.bind (....) */
   bind( sock, (struct sockaddr*)&addr, sizeof(addr) );

Чего я не совсем понимаю, так это того, как привязатьsк локальной конечной точке? Нет никаких IP-адресов или портов.

Есть ли что-то еще, что нужно реализовать помимо конечной точки, чтобы все заработало?

9
задан farnsworth 6 May 2012 в 12:17
поделиться