клиентское соединение telnet перестает получать данные, сервер все еще отправляет - PullRequest
5 голосов
/ 15 июня 2010

Я работаю во встроенной среде 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, проблема не воспроизводима.

1 Ответ

1 голос
/ 17 июня 2010

Первое, что я хотел бы сделать, это достать Wireshark и попытаться выяснить, действительно ли сервер отправляет сообщение.Было бы полезно запустить Wireshark на сервере, а также на стороннем ПК.Что-нибудь изменилось в последнем сердцебиении?


Редактировать. Ну, это была интересная находка для вашего клиента.

Кажется, что-тотерминальная вещь в пути.Вы можете использовать программу netcat вместо telnetd.Netcat предназначен для отправки произвольных данных через сеанс TCP в необработанном режиме без какого-либо специального форматирования и имеет возможность подключать произвольный процесс к сокету.На компьютере с Windows вы можете использовать PuTTY в необработанном режиме, чтобы выполнить то же самое.

Возможно, стоит изучить трафик с третьей стороной между вашим клиентом и сервером.Ядро может оптимизировать запись в сеть и внутреннюю буферизацию данных.Это единственный способ убедиться, что то, что видно, действительно происходит на проводе.

...