问题描述
我在想使用来读取数据。
在中没有什么奇特的事情,并且设备应该
的行为像回环接口,并与原始套接字一起使用。
I was thinking of making use of Boost Asio to read data from a Socket CAN.There's nothing fancy going on in linux/can.h , and the device shouldbehave like the loopback interface, and be used with a raw socket.
查看 basic_raw_socket
接口看来我可以使用
分配用
Looking at the basic_raw_socket
interface it seems that I can make use ofbasic_raw_socket::assign to assign the native socket created with
socket( PF_CAN, SOCK_RAW, CAN_RAW );
这是我到目前为止
namespace can {
class CanSocket {
public:
typedef boost::asio::ip::basic_endpoint<CanSocket> endpoint;
typedef boost::asio::ip::basic_resolver_query<CanSocket> resolver_query;
typedef boost::asio::ip::basic_resolver_iterator<CanSocket> resolver_iterator;
typedef boost::asio::basic_raw_socket<CanSocket> socket;
typedef boost::asio::ip::basic_resolver<CanSocket> 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;
};
}
这是我如何在我的应用程序中使用
And this is how I use it in my application
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或端口。
What I don't quite get is how do I bind s
to the local endpoint? There are no IPs or ports involved.
除了端点,还有其他什么要实现吗?
Is there anything else that should be implemented besides the endpoint to get it going?
推荐答案
解决方案是使用 posix :: stream_descriptor
。
只需打开本地套接字,绑定,然后使用 posix :: basic_stream_descriptor :: assign
。
Just open the native socket, bind and then use posix::basic_stream_descriptor::assign
.
这篇关于boost :: asio在SocketCAN的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!