15: SimpleSocket( AF_CAN, type, protocol)
20 sockaddr_can addr = {};
21 addr.can_family = AF_CAN;
24 if(
::connect( m_socket, (sockaddr*) &addr,
sizeof(addr)) < 0)
30 sockaddr_can addr = {};
31 addr.can_family = AF_CAN;
34 if(
::bind( m_socket, (sockaddr*) &addr,
sizeof(addr)) < 0)
41 socklen_t addr_len =
sizeof(addr);
43 if( ::getsockname( m_socket, (sockaddr*) &addr, &addr_len) < 0)
52 socklen_t addr_len =
sizeof(addr);
54 if( ::getpeername( m_socket, (sockaddr*) &addr, &addr_len) < 0)
63 ifr.ifr_ifindex = addr.can_ifindex;
65 if( ioctl( m_socket, SIOCGIFNAME, &ifr) < 0)
68 return std::string(ifr.ifr_name);
73 const size_t len = interface.length();
75 if( len == 0)
return 0;
78 if( len >= IF_NAMESIZE)
82 std::memcpy( ifr.ifr_name, interface.data(), len);
83 ifr.ifr_name[len] = 0;
85 if( ioctl( m_socket, SIOCGIFINDEX, &ifr) < 0)
88 return ifr.ifr_ifindex;
93 std::ostringstream oss;
94 if( can_id & CAN_ERR_FLAG)
96 const canid_t error_mask = can_id & CAN_ERR_MASK;
107 const bool extended = (can_id & CAN_EFF_FLAG) != 0;
108 const bool rtr = (can_id & CAN_RTR_FLAG) != 0;
110 can_id & (extended ? CAN_EFF_MASK : CAN_SFF_MASK);
112 oss << (extended ?
"EFF:0x" :
"SFF:0x")
115 << std::setw(extended ? 8 : 3)
119 if (rtr) oss <<
" RTR";
std::string getLocalInterface() const
int getInterfaceIndex(std::string_view interface) const
get CAN interface index from interface name
CANSocket(int type, int protocol)
allows a subclass to create new socket
void bind(std::string_view interface="")
static std::string formatCANID(::canid_t can_id)
format canid_t into string for logs
std::string getInterfaceName(const sockaddr_can &addr) const
get CAN interface name from socket address structure
std::string getForeignInterface() const
void connect(std::string_view interface="")
Signals a problem with the execution of a socket call.