Est-ce que la lecture d'un flux telnet dans un tableau d'octets volumineux attend que le tableau d'octets soit plein?

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

  •  03-07-2019
  •  | 
  •  

Question

Après avoir lu quelques questions et réponses ici, il semble qu'un flux telnet ne se ferme jamais vraiment. L'utilisation de DataAvailable () ne sera pas renvoyée.

J'ai hérité d'un code très long à terminer et nous pensions que c'était le serveur Telnet qui posait problème. Cependant, il existe un octet [32757] dans lequel le code tente de stocker la réponse du serveur telnet.

Quelque chose comme ce qui suit:

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

S'il n'y a pas 32757 octets ou plus, je suppose que ce code attend que suffisamment de paquets vides soient envoyés pour constituer la taille du tableau d'octets. Est-ce correct?

Existe-t-il un moyen de vérifier si le serveur telnet a fini d'envoyer tout ce qu'il veut? Il n'y a pas de caractère ou chaîne de fin visible dans chaque 'page' de la session telnet.

Je pensais que l’un des moyens de corriger ce code était de lire quelques octets à la fois, de l’ajouter à une chaîne, de rechercher dans la chaîne un caractère de fin ou un ensemble de caractères et d’y retourner le cas échéant. Sinon, lisez plus d'octets, ajoutez-le à la chaîne et vérifiez à nouveau.

Des suggestions?

Était-ce utile?

La solution

Non, Stream.Read n'attend généralement pas jusqu'à ce qu'il ait tout lu, et c'est encore moins probable pour un flux réseau. Il lira toutes les données disponibles ou bloquera jusqu'à ce qu'il y ait des données disponibles, mais c'est tout.

Il n'y a pas de véritable concept de serveur "finition". envoyer ce que ça va envoyer, sauf si:

  • a) il vous dit à l'avance combien il va envoyer
  • b) il indique quand il a terminé avec une sorte de donnée de terminaison
  • c) il ferme la connexion

Vous pouvez utiliser une minuterie pour obtenir un effet de "lecture continue jusqu'à ce que l'une des lectures prenne plus de 5 secondes". Notez que la lecture aurait toujours lieu - vous choisissez simplement le moment de mettre à jour l'interface utilisateur (ou autre). C'est un sujet assez délicat, et vous devez vraiment très savoir clairement dans votre esprit (et dans la documentation!) De ce que vous voulez faire et du fil qui va gérer quoi.

Une alternative consiste à définir un délai de lecture sur TcpClient , mais je n'ai pas l'expérience de cela. Il vous suffira probablement d'utiliser TcpClient.ReceiveTimeout , puis gérez correctement l’exception IOException résultante lors de la lecture, mais je n’ai aucun conseil à vous proposer.

Autres conseils

En plus de l'explication de Jon Skeets, un petit conseil:

Puisque telnet est un protocole basé sur du texte (ligne), lire byte [] signifie que vous devrez ré-assembler le texte. Vous serez mieux avec un TextReader:

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

Je suppose ici que telnet utilise ASCII.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top