static async Task RunCanLoopAsync(CancellationToken cancellationToken) { var factory = new SocketCanFactory(); var incomingBuffer = new byte[16]; var incomingFrame = new CanFrame(); using (var socket = factory.CreateSocket("can0")) { while (true) { await socket.ReceiveAsync(incomingBuffer, SocketFlags.None, CancellationToken.None).ConfigureAwait(false); incomingFrame.Reinitialize(incomingBuffer); try { await socket.SendAsync(new CanFrame { IsExtendedFrame = true, Id = incomingFrame.Id - 1, DataLength = 4 }.FrameBytes, SocketFlags.None).ConfigureAwait(false); } catch (SocketException se) when(se.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { Console.WriteLine("No buffer space available waiting a few ms"); await Task.Delay(TimeSpan.FromMilliseconds(10), cancellationToken).ConfigureAwait(false); } } } }
static async Task SimpleLoopBackAsync(string adapter, CancellationToken cancellationToken) { var factory = new SocketCanFactory(); var incomingBuffer = new byte[CanFrame.FrameLength]; using var socket = factory.CreateSocket(adapter); { Console.WriteLine($"Created adapter: {adapter}"); while (true) { await socket.ReceiveAsync(incomingBuffer, SocketFlags.None, CancellationToken.None).ConfigureAwait(false); var incomingFrame = new CanFrame(incomingBuffer); Console.WriteLine($"Received {nameof(CanFrame)} Id: {incomingFrame.Id} IsRtr: {incomingFrame.IsRemoteTransmissionRequest} Length: {incomingFrame.DataLength} IsError: {incomingFrame.IsErrorMessage} Data: {ByteArrayToString(incomingFrame.Data)}"); try { var sendFrame = new CanFrame { IsExtendedFrame = true, Id = incomingFrame.Id - 1, DataLength = 4 }; sendFrame.Data[0] = 1; sendFrame.Data[1] = 2; sendFrame.Data[2] = 3; sendFrame.Data[3] = 4; await socket.SendAsync(sendFrame.FrameBytes, SocketFlags.None).ConfigureAwait(false); } catch (SocketException se) when(se.SocketErrorCode == SocketError.NoBufferSpaceAvailable) { // Default the buffer space is only 10 message you can extend this on Linux or wait a while before retransmitting. // RUN: "ip link set can0 txqueuelen 1000" to increase size to 1000 messages where can0 is the name of the SocketCAN interface in Linux Console.WriteLine("No buffer space available waiting a few ms"); await Task.Delay(TimeSpan.FromMilliseconds(10), cancellationToken).ConfigureAwait(false); } } } }