Я работаю во встроенной среде Linux.
при запуске запускается демон telnet, который наблюдает за конкретным портом, и запускает программу при получении соединения.
т.е.
telnetd -l /usr/local/bin/PROGA -p 1234
PROGA - выводит некоторые данные с нерегулярными интервалами. Когда он не выводит данные, каждый X период времени он отправляет строку типа «сердцебиение», чтобы клиент знал, что мы все еще активны, то есть «сердцебиение \ r \ n»
Через некоторое время клиент (использующий версию telnet для Linux, запущенный с помощью: telnet xxx.xxx.xxx.xxx 1234)
не сможет получить 'heartbeat \ r \ n'
Данные, которые видит клиент:
heartbeat
heartbeat
heartbeat
...
heartbeat
[nothing, should have received heartbeat]
[nothing forever]
сердцебиение отправлено:
result = printf("%s", heartbeat);
результат проверки, это всегда длина heartbeat
. Регистрация в системном журнале показывает нам, что printf()
успешно выполняется с правильными интервалами
С тех пор я добавил в tcdrain и fflush , которые оба возвращают успех, но, похоже, не помогают ситуации.
Любая помощь будет оценена.
** UDPATE: получен перехват провода со стороны сервера. Совершенно ясно, что сердцебиение посылается постоянно. Нет икоты, никаких задержек. Нашел что-то интересное на клиенте, хотя. Клиент в этом тестовом примере (telnet в Ubuntu 9.04), кажется, внезапно прекращает получать пульс (как описано выше). Wireshark подтверждает это, большая пауза в пакетах. Что ж, после того, как клиент перестал получать сердцебиение, нажатие любого нажатия клавиши (на клиенте), кажется, вызывает выброс данных из буфера клиента (все сердцебиения). Wireshark на клиенте также показывает огромное количество данных в одном пакете.
К сожалению, я действительно не знаю, что это значит. Это линейный режим вкл / выкл вещь? Концы строк (\ r \ n) очень четко просматриваются.
** Обновление 2: работает netcat вместо telnetd, проблема не воспроизводима.