2010-06-14 10 views
5

Estoy trabajando en un entorno de Linux incrustado.conexión de cliente telnet deja de recibir datos, el servidor todavía está enviando

lanza un daemon de telnet en el inicio que mira en un puerto en particular y lanza un programa cuando se recibe una conexión.

es decir

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

PROGA - salida voluntad algunos datos a intervalos irregulares. Cuando no está emitiendo datos, cada X período de tiempo envía una cadena tipo 'latido' para indicarle al cliente que todavía estamos activos, es decir, "heartbeat \ r \ n"

Después de un período aleatorio de tiempo, el cliente (usar una versión para Linux de telnet, lanzado por: telnet xxx.xxx.xxx.xxx 1234) dejará de recibir el 'latido del corazón \ r \ n'

los datos que el cliente ve:

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

latidos del corazón se envía:

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

comprobación de resultado, siempre es la longitud de heartbeat. El registro en syslog nos muestra que el printf() está ejecutando con éxito en los intervalos adecuados

ya he añadido en un tcdrain y fflush el que tanto éxito regresar, pero no parecen ayudar a la situación.

Cualquier ayuda sería apreciada.

** UDPATE: obtuve una captura de wireshark desde el servidor. Muy claramente, el latido del corazón se envía continuamente. Sin Hicups, sin retrasos. Encontré algo interesante en el cliente sin embargo. El cliente en este caso de prueba (telnet en Ubuntu 9.04) parece dejar de recibir latidos repentinamente (como se describe arriba). Wireshark confirma esto, gran pausa en paquetes. Bueno, una vez que el cliente dejó de recibir el latido del corazón, presionar cualquier tecla (en el cliente) parece desencadenar una descarga de datos desde el búfer del cliente (todos los latidos del corazón). Wireshark en el cliente también muestra esta gran cantidad de datos, todo en un solo paquete.

Lamentablemente, realmente no sé lo que esto significa. Es esto un modo de encendido/apagado de línea? Las terminaciones de línea (\ r \ n) están llegando muy claramente.

** Actualización 2: al ejecutar netcat en lugar de telnetd, el problema no es reproducible.

+0

¿cómo se ven las otras cadenas que envía? si envía un byte de 255, necesita ser escapado ... – Spudd86

+0

No creo que las otras cadenas sean relevantes, ya que este error/problema puede reproducirse enviando solo la cadena 'heartbeat' una y otra vez – Tree77

Respuesta

1

Lo primero que haría es sacar Wireshark y tratar de averiguar si el servidor realmente está enviando el mensaje. Sería instructivo ejecutar Wireshark en el servidor y en PC de terceros. ¿Hay algo diferente sobre el último latido del corazón?


Editar. Bueno, eso fue un hallazgo interesante para su cliente.

Parece que hay algún tipo de terminal en el camino. Es posible que desee utilizar el programa de netcat en lugar de telnetd. netcat está diseñado para enviar datos arbitrarios a través de una sesión TCP en modo raw, sin ningún formato especial, y tiene la capacidad de conectar un proceso arbitrario a un socket. En una máquina con Windows puedes usar PuTTY en modo raw para lograr lo mismo.

Todavía puede valer la pena examinar el tráfico con un tercero entre su cliente y servidor. El kernel puede estar optimizando las escrituras de la red e internamente almacenando los datos. Esa es la única forma de garantizar que lo que se ve sea lo que realmente sucede en el cable.

+0

Sí, tuve pensado en wireshark para la captura de datos hace un día. Obtuve datos de wireshark del cliente. No está viendo el latido del corazón. Estoy trabajando para obtener wireshark del servidor. Actualizaré la pregunta cuando obtenga esos datos. No hay nada diferente o dinámico sobre los latidos del corazón. Cliente de Linux (para probar) es el cliente de telnet con Ubuntu 9.04 – Tree77

Cuestiones relacionadas