2009-03-30 6 views
1

J'utilise la classe TcpClient pour implémenter une connexion Telnet. Ce que je ne sais pas, c'est comment déterminer la fin de la réponse. Il semble qu'une fois que la propriété DataAvailable a la valeur true, j'ai lu les données de Stream et DataAvailable est temporairement défini sur false pendant que le tampon est rempli avec un autre bloc de données, mais je pense que tout est lu et disparaît. Comment puis-je m'assurer que toutes les réponses ont été lues?Comment gérer les retards sur la connexion Telnet par programme?

Vous pouvez me conseiller comment modifier l'extrait de code ci-dessous pour que cela fonctionne correctement. Cela fonctionne correctement lorsque je parcours le code car il y a suffisamment de temps pour récupérer toute la réponse. Apprécier ton 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; 
} 

Répondre

2

Avec les connexions TCP pour des applications telles que Telnet, il n'existe pas de notion de fin de transmission. Vous trouverez souvent des clients telnet qui envoient chaque touche en appuyant une à la fois au fur et à mesure que l'utilisateur les saisit et c'est au serveur de décider quand agir, normalement quand il reçoit un saut de ligne. D'autres clients peuvent mettre en mémoire tampon quelques touches de client et les envoyer tous en même temps.

Par l'apparence de votre application, vous devriez rechercher des sauts de ligne 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"));  
0

Je ne pense pas que ce soit une bonne idée d'utiliser DataAvailable à cette fin. La fin de votre réponse est ce que votre protocole dit.

Il est préférable d'utiliser des appels bloquants comme Lire pour lire vos documents, et d'utiliser le protocole que vous avez établi pour déterminer à lire plus, et combien. Il se peut que toutes les données que vous souhaitez ne soient pas renvoyées, car Read ne revient pas lorsque toutes vos données sont lues, mais lorsque certaines données sont lues, vous devez vérifier la quantité de données lues. Si votre protocole est Telnet, vous voudrez probablement répondre à chaque octet reçu, comme avec un terminal dont vous voulez faire l'écho ou traiter des commandes ou quoi que ce soit. DataAvailable est peut-être adapté pour vérifier si un Read serait bloqué lorsqu'il est appelé (il reviendra avec tout ce qu'il y a dans le buffer) mais cela rendra votre boucle moins directe.

0

S'agit-il d'une connexion Telnet réelle, c'est-à-dire que vous vous connectez à un serveur Telnet ou par «Telnet», voulez-vous vraiment dire «Socket TCP/IP»?

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

+0

Il s'agit d'une connexion au serveur telnet utilisant le port TCP/IP et le port 23. Le serveur ne met pas fin à la connexion. La première partie de la session Telnet est l'authentification lorsque le serveur demande le premier nom d'utilisateur, puis le mot de passe. Je vais vérifier le délimiteur et vous laisser savoir plus tard. Je vous remercie. – David

+0

En supposant que le serveur Telnet est une session de console sous Unix/BSD/Windows/etc. serveur, vous pouvez utiliser le texte de l'invite de commande comme délimiteur. –

Questions connexes