internal CANBusBBB(string CanName, bool CANFD) { this.CANFD = CANFD; this.Socket = socket(PF_CAN, SOCK_RAW, CAN_RAW); if (this.Socket < 0) { throw new Exception("Error while opening socket. Error code: " + Marshal.GetLastWin32Error()); } unsafe { IfRequest Req = new IfRequest(); for (int i = 0; i < CanName.Length; i++) { Req.Name[i] = Convert.ToByte(CanName[i]); } Req.Name[CanName.Length] = 0; if (ioctl(Socket, SIOCGIFINDEX, ref Req) < 0) { throw new Exception("Error during IO Control. Error code: " + Marshal.GetLastWin32Error()); } SockAddrCan Addr = new SockAddrCan(); Addr.CanFamily = AF_CAN; Addr.CanIfIndex = Req.IfIndex; if (bind(Socket, ref Addr, Marshal.SizeOf(Addr)) < 0) { throw new Exception("Error while binding socket. Error code: " + Marshal.GetLastWin32Error()); } ; if (CANFD) { int FD = CANFD ? 1 : 0; if (setsockopt(Socket, SOL_CAN_RAW, CAN_RAW_FD_FRAMES, ref FD, Marshal.SizeOf(FD)) != 0) { throw new Exception("Failed to enable Extended CAN. Error code: " + Marshal.GetLastWin32Error()); } } } }
private static extern int bind(int FileDescriptor, ref SockAddrCan Addr, int AddrLen);