У меня необычная ситуация: я использую систему Linux во встроенной ситуации (Intel Box, в настоящее время использует ядро 2.6.20), который должен взаимодействовать со встроенной системой, в которой частично нарушена реализация TCP , Насколько я могу судить прямо сейчас, они ожидают, что каждое наше сообщение придет в отдельном кадре Ethernet! Кажется, у них проблемы, когда сообщения разбиты по фреймам Ethernet.
Мы находимся в локальной сети с устройством, и между нами нет маршрутизаторов (только коммутатор).
Мы, конечно, пытаемся заставить их исправить свою систему, но это может оказаться неосуществимым.
Я уже установил TCP_NODELAY на своих сокетах (я подключаюсь к ним), но это помогает, только если я не пытаюсь отправить более одного сообщения за раз. Если у меня есть несколько исходящих сообщений подряд, эти сообщения, как правило, оказываются в одном или двух кадрах Ethernet, что вызывает проблемы в другой системе.
Обычно я могу избежать этой проблемы, используя таймер, чтобы избежать посылки сообщений слишком близко друг к другу, но это, очевидно, ограничивает нашу пропускную способность. Кроме того, если я уменьшу время до минимума, я рискую перегружать сеть, задерживая передачу пакетов и в конечном итоге допуская более одного моего сообщения в один и тот же пакет.
Можно ли как-нибудь определить, есть ли у драйвера данные в очереди или нет? Есть ли способ заставить драйвер отправлять независимые вызовы записи в пакетах независимого транспортного уровня? Я просмотрел справочные страницы по socket (7) и tcp (7) и ничего не нашел. Может быть, я просто не знаю, что ищу.
Очевидно, что UDP был бы одним из выходов, но, опять же, я не думаю, что мы можем заставить другой конец что-то сильно изменить на этом этапе.
Любая помощь с благодарностью.