SocketCan: чтение() данных после записи()

Я реализую небольшое подмножество клиента UDS с SocketCAN на встроенном Linux. Связь между клиентом и сервером работает по шаблону запрос/ответ. Я хотел бы прочитать() ответ сервера после использования записи() для отправки запроса UDS. Проблема заключается в том, что когда в буфере приема существуют более старые данные (которые были получены до вызова write()), функция read() возвращает эти старые данные. Как я могу а) очистить входной буфер или б) определить временную метку полученных данных ответа для сравнения с временной меткой запроса? Какое самое чистое решение для этого? Поскольку read() блокируется, когда нет данных для возврата, не так просто просто прочитать фиктивное чтение, пока буфер не станет пустым. Я чувствую, что для этого должно быть простое решение, но я новичок в socket() и его друзьях...

Спасибо за вашу помощь!


person nico1000    schedule 21.04.2021    source источник
comment
Есть ли причина, по которой вы не можете просто выполнить неблокирующее чтение всех данных перед записью? (см. man-страницу для fcntl).   -  person Tom V    schedule 21.04.2021
comment
Можно ли использовать системный вызов «опрос», чтобы проверить, есть ли событие «данные для чтения»?   -  person JosiP    schedule 21.04.2021
comment
Вы хотите использовать select() или poll(), чтобы проверить, действительно ли сокет имеет данные для чтения. Вы также можете установить для сокета значение O_NONBLOCK с помощью fcntl, чтобы добиться неблокирующего чтения.   -  person tofro    schedule 22.04.2021


Ответы (1)


Спасибо за ваши комментарии. Теперь я нашел лучшее решение для моего варианта использования:

Путем вызова ioctl() с параметром SIOCGSTAMP (см. https://linux.die.net/man/7/socket) после read() я могу проверить метку времени полученных данных CAN. Если отметка времени старше, чем у последнего вызова write(), я просто повторяю чтение() до тех пор, пока отметка времени не станет новее.

person nico1000    schedule 22.04.2021