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