2010-06-14 3 views
5

Я работаю во встроенной среде Linux.telnet клиентское соединение перестает получать данные, сервер по-прежнему отправляет

он запускает демон telnet при запуске, который следит за конкретным портом и запускает программу при получении соединения.

т.е.

telnetd -l /usr/local/bin/PROGA -p 1234 

PROGA - будет выводить некоторые данные через неравные промежутки времени. Когда он не выводит данные, каждый X-период времени отправляет строку типа «сердцебиение», чтобы клиент знал, что мы все еще активны, т.е. «heartbeat \ r \ n»

После случайного количества времени, клиент (используйте версию Линукс из телнета, выдвинутая: telnet xxx.xxx.xxx.xxx 1234) не сможет получить «биение сердца \ г \ п»

данные клиент видит:

heartbeat 
heartbeat 
heartbeat 
... 
heartbeat 
[nothing, should have received heartbeat] 
[nothing forever] 

сердцебиения посылается:

result = printf("%s", heartbeat); 

проверка результат, всегда длина heartbeat. Вход в системный журнал показывает нам, что printf() выполняет с успехом в соответствующих интервалах

Я с тех пор добавил в tcdrain и fflush, которые возвращают успех, но не похоже, чтобы помочь ситуации.

Любая помощь будет оценена по достоинству.

** UDPATE: получил захват проводов с сервера. Очень ясно, что сердцебиение посылается непрерывно. Нет Hicups, никаких задержек. Нашел что-то интересное на клиенте. Клиент в этом случае (telnet на Ubuntu 9.04), кажется, внезапно перестает получать сердцебиение (как описано выше). Wireshark подтверждает это, большая пауза в пакетах. Ну, как только клиент перестает получать сердцебиение, нажатие любого нажатия клавиши (на клиенте), похоже, вызывает отталкивание данных из буфера клиента (все пульса). Wireshark на клиенте также показывает этот массивный объем данных в одном пакете.

К сожалению, я действительно не знаю, что это значит. Это режим линии вкл/выкл? Линейные окончания (\ r \ n) очень четко проходят.

** Обновление 2: запуск netcat вместо telnetd, проблема не воспроизводится.

+0

Каковы другие строки, которые вы отправляете? если вы отправляете 255 байт, его нужно экранировать ... – Spudd86

+0

Я не думаю, что другие строки релевантны, так как эта ошибка/проблема может быть воспроизведена только путем отправки строки «heartbeat» снова и снова – Tree77

ответ

1

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


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

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

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

+0

Да, у меня было подумал о wirehark для сбора данных днем ​​назад. Я получил данные от клиента. Его не видно сердцебиения. Я работаю над получением wirehark с сервера. Будет обновлен вопрос, когда я получу эти данные. Нет ничего особенного или динамичного в сердцебиении. Клиент Linux (для тестирования) - клиент telnet с Ubuntu 9.04 – Tree77