Question

J'utilise la classe TcpClient pour mettre en œuvre une connexion telnet. Ce que je ne sais pas comment déterminer la fin de la réponse. Il semble qu'une fois la propriété DataAvailable est vrai, je l'ai lu les données de flux et DataAvailable est ensuite mis temporairement à false tandis que le tampon est rempli avec un autre morceau de données, mais je pense que tout est lu et aller loin. Comment puis-je assurer que toutes les réponses a été lu?

Vous pourriez me conseiller comment modifier l'extrait de code ci-dessous pour faire ce travail correctement. Il fonctionne correctement lorsque je fais un pas dans le code parce qu'il ya beaucoup de temps pour toute la réponse à récupérer. Appréciez votre aide.

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;
}
Était-ce utile?

La solution

Avec les connexions TCP pour des applications telles que Telnet il n'y a pas ce concept comme la fin de la transmission. Vous trouverez souvent des clients telnet qui envoient chacun appuyer sur la touche à la fois que l'utilisateur les saisit et il appartient au serveur de décider quand prendre des mesures, normalement quand il fait un saut de ligne. D'autres clients peuvent tamponner jusqu'à quelques touches de clients et de les envoyer à la fois.

Par l'apparence de votre application, vous devez chercher interlignes pour indiquer la fin d'une transmission.

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"));       

Autres conseils

Je ne pense pas que ce soit une bonne idée d'utiliser DataAvailable à cet effet. La fin de votre réponse est tout ce que le protocole dit qu'il est.

Il vaut mieux lire pour lire vos trucs, et à utiliser quel que soit le protocole que vous avez mis en place pour les appels de blocage comme utiliser de déterminer pour en savoir plus, et combien. Il est peut-être que toutes les données que vous voulez est retourné, parce que Read ne retourne pas quand toutes vos données sont lues, mais quand certaines données sont lues, vous devez vérifier à quel point a été lu.

Si votre protocole Telnet est, vous voudrez probablement répondre à chaque octet unique reçu, comme un terminal que vous voulez en faire l'écho ou des commandes de processus ou de ce pas.

DataAvailable est peut-être adapté pour vérifier si une lecture bloquerait lorsqu'il est appelé (il sera de retour avec tout ce qui est dans la mémoire tampon), mais il rend votre boucle moins simple.

Est-ce une connexion telnet réelle, à savoir vous connectez-vous à un serveur telnet ou « telnet » voulez-vous dire vraiment "socket TCP / IP?

Tout d'abord déterminer si le serveur abandonne la connexion lorsque la transmission est terminée. Si oui, vous pouvez simplement lire jusqu'à la fin du flux. Dans le cas contraire, sinon, vous allez devoir utiliser un signal dans les données pour déterminer si la lecture est terminée. Différents protocoles fonctionnent de différentes manières à cet égard si vous pouviez nous éclairer sur le protocole que nous pourrions être en mesure de donner une réponse plus directe. Les approches se répartissent généralement en deux camps: y compris le nombre d'octets / caractères au début de la réponse (le récepteur lit simplement que le nombre d'octets / caractères) ou en utilisant autre marqueur pour délimiter la fin de la réponse (le récepteur lit jusqu'à la réception de la délimiteur).

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