¿La lectura de un flujo de telnet en una matriz de bytes grande espera hasta que la matriz de bytes esté llena?

StackOverflow https://stackoverflow.com/questions/810963

  •  03-07-2019
  •  | 
  •  

Pregunta

Después de leer algunas preguntas y respuestas aquí, parece que una transmisión de telnet nunca se cierra realmente. El uso de DataAvailable () no volverá.

He heredado un código que tardó mucho tiempo en completarse y pensamos que el problema era el servidor de telnet. Sin embargo, hay un byte [32757] en el que el código intenta almacenar la respuesta del servidor telnet.

Algo como lo siguiente:

Byte byteArray[] = new Byte[32757];
TcpClient sock = new TcpClient();
sock.GetStream().read(byteArray, 0 byteArray.length);

Si no hay 32757 bytes o más, asumo que este código espera hasta que se envíen suficientes paquetes vacíos para completar el tamaño de la matriz de bytes. ¿Esto es correcto?

¿Hay alguna forma de verificar si el servidor de telnet ha terminado de enviar todo lo que desea? No hay caracteres o cadenas de terminación visibles en cada 'página' de la sesión de telnet.

Estaba pensando que una forma de corregir este código es leer unos pocos bytes a la vez, agregarlo a una cadena, revisar la cadena para un carácter de terminación o conjunto de caracteres y devolverlo si se encuentra. De lo contrario, lea más bytes, agregue eso a la cadena y verifique nuevamente.

Sugerencias?

¿Fue útil?

Solución

No, Stream.Read generalmente no espera hasta que se lee todo, y es incluso menos probable que se trate de una transmisión de red. Leerá los datos disponibles o los bloqueará hasta que haya algunos datos disponibles, pero eso es todo.

No hay un concepto real del servidor " acabado " enviando lo que va a enviar, a menos que:

  • a) le dice de antemano cuánto va a enviar
  • b) indica cuándo ha terminado con algún tipo de datos de terminación
  • c) cierra la conexión

Es posible que desee utilizar un temporizador de algún tipo para lograr un efecto de "seguir leyendo" hasta que una de las lecturas demore más de 5 segundos. Sin embargo, ten en cuenta que la lectura todavía estaría sucediendo, solo elegirías esa hora para actualizar la interfaz de usuario (o lo que sea). Es un tema bastante delicado, y realmente necesitas tener muy claro en tu propia mente (¡y documentos!) Lo que quieres hacer y qué hilo va a manejar qué.

Una alternativa es establecer un tiempo de espera de lectura en el TcpClient , pero no tengo experiencia en eso. Probablemente solo necesite usar TcpClient.ReceiveTimeout y luego administre la IOException resultante cuando lo lea, pero no tengo ningún consejo que ofrecer.

Otros consejos

Además de la explicación de Jon Skeets, un pequeño consejo:

dado que telnet es un protocolo basado en texto (línea), leer en byte [] significa que tendrá que volver a ensamblar el texto. Estarás mejor con un TextReader:

System.IO.TextReader reader = new System.IO.StreamReader(
           sock.GetStream(), Encoding.ASCII);
string line;
while ((line = reader.ReadLine()) != null)  ...;

Supongo que aquí telnet utiliza ASCII.

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