Pregunta

utilizo clase TcpClient para implementar una conexión telnet. Lo que no sé es cómo determinar el final de la respuesta. Parece que una vez que la propiedad DataAvailable es cierto, he leído los datos de corriente y DataAvailable continuación se ajusta temporalmente en memoria intermedia falsa mientras se está llenando con otro fragmento de datos, pero creo que es todo lo lea y desaparece. ¿Cómo me aseguro de que todo se leyó la respuesta?

Es posible que me aconsejará cómo cambiar el fragmento de código siguiente para que esto funcione correctamente. Funciona correctamente cuando me paso a través del código porque no hay tiempo de sobra para toda la respuesta a ser recuperada. Agradecemos su ayuda.

if (this.Stream.DataAvailable)
{
    readBuffer = new Byte[this.Client.ReceiveBufferSize];
    do
    {
        // read data
        bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);
        Thread.Sleep(10);
        responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString(readBuffer, 0, bytes));

       } while (this.Stream.DataAvailable);

       allDataRead = true;
       break;
}
¿Fue útil?

Solución

Con conexiones TCP para aplicaciones como Telnet no existe el concepto como el final de la transmisión. Usted encontrará a menudo los clientes Telnet que envían cada pulsación de tecla uno a la vez que el usuario entra en ellos y le toca al servidor para decidir cuándo tomar acción, normalmente cuando se pone un avance de línea. Otros clientes pueden amortiguar unas cuantas pulsaciones de teclas cliente y enviarlos todos a la vez.

Por el aspecto de su aplicación se debe buscar líneas de avance para indicar el final de una transmisión.

do    
{      
     bytes = this.Stream.Read(readBuffer, 0, readBuffer.Length);             
     responseData = String.Concat(responseData, System.Text.Encoding.ASCII.GetString (readBuffer, 0, bytes));       
} while (this.Stream.DataAvailable && !responseData.Contains("\n"));       

Otros consejos

No creo que sea una buena idea utilizar DataAvailable para este propósito. Al final de su respuesta es cualquiera que sea su protocolo dice que es.

Es mejor utilizar llamadas de bloqueo como Leer para leer sus cosas, y utilizar cualquier protocolo que haya establecido para determinar a leer más, y cuánto. Puede ser que no se devuelve todos los datos que desea, porque Lee no regresa cuando se lee todos los datos, pero cuando se lee algunos datos, por lo que es necesario comprobar la cantidad que se leyó.

Si su protocolo Telnet es, es probable que desee para responder a cada byte recibido, al igual que con un terminal que desea hacerse eco de ella o comandos de proceso o lo que no.

DataAvailable es quizás adecuado para comprobar si una Leer bloquearía cuando se le llama (que volverá con lo que hay en el buffer) pero hace que su bucle menos sencilla.

¿Es esta una conexión telnet real, es decir, se le conecta a un servidor telnet o por 'telnet' es lo que realmente quiere decir 'socket TCP / IP'?

En primer lugar determinar si el servidor corta la conexión cuando la transmisión se ha completado. Si es así, sólo tiene que leer hasta el final de la secuencia. De lo contrario, si no, vas a tener que utilizar una señal en los datos para determinar si la lectura se ha completado. Diferentes protocolos funcionan de maneras diferentes en este sentido por lo que si nos pudiera iluminar al protocolo que puede ser capaz de dar una respuesta más directa. Enfoques generalmente se dividen en dos campos: incluyendo un recuento de bytes / caracteres al comienzo de la respuesta (el receptor simplemente lee que muchos bytes / caracteres) o bien utilizando un marcador para delimitar el final de la respuesta (el receptor lee hasta la recepción de la delimitador).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top