Pergunta

Eu utilizo classe TcpClient para implementar uma conexão telnet. O que eu não sei é como determinar o fim da resposta. Parece que uma vez propriedade DataAvailable é verdade, eu ler os dados do Stream e DataAvailable é então definir temporariamente a falsa enquanto buffer está sendo preenchido com outro pedaço de dados, mas eu acho que é tudo de leitura e ir embora. Como posso garantir que todos resposta foi lido?

Você pode aconselhar-me como alterar o trecho de código abaixo para fazer este trabalho corretamente. Ele funciona corretamente quando eu passo através do código, porque não há tempo de sobra para toda a resposta a ser recuperado. Agradecemos a sua ajuda.

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;
}
Foi útil?

Solução

conexões com TCP para aplicações como Telnet não há nenhum conceito como o fim da transmissão. Você vai encontrar muitas vezes telnet clientes que enviam cada vez que pressionar uma tecla de cada vez que o usuário digita-los e cabe ao servidor para decidir quando agir, normalmente quando ele recebe uma alimentação de linha. Outros clientes podem tamponar-se algumas teclas pressionadas cliente e enviá-los todos de uma vez.

Pela aparência do seu aplicativo você deve estar olhando para feeds de linha para indicar o fim de uma transmissão.

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

Outras dicas

Eu não acho que é uma boa idéia usar DataAvailable para esta finalidade. O fim da sua resposta é o que o seu protocolo diz que é.

É melhor usar chamadas de bloqueio como Ler para ler as suas coisas, e usar qualquer protocolo que você estabeleceu para determinar a ler mais, e quanto. Pode ser que nem todos os dados que você quer é devolvido, porque Leia não retornar quando todos os seus dados é lido, mas quando alguns dados é lido, então você precisa verificar de quanto foi lido.

Se o seu protocolo é Telnet, você provavelmente vai querer responder a cada byte recebido, como com um terminal que você quer eco-lo ou comandos de processo ou que não.

DataAvailable é talvez adequado para verificar se um Leia iria bloquear quando chamado (ele irá retornar com o que está no buffer), mas ele faz o seu ciclo menos simples.

Esta é uma conexão telnet real, ou seja, você está conectado a um servidor telnet ou 'telnet' Você realmente quer dizer 'socket TCP / IP'?

Em primeiro lugar determinar se o servidor derruba a conexão quando a transmissão está completa. Se assim for, você pode simplesmente ler até o fim do fluxo. Caso contrário, se não, você vai ter que usar uma sugestão nos dados para determinar se a leitura está completa. Diferentes protocolos funcionam de maneiras diferentes a este respeito assim se você pudesse esclarecer-nos com o protocolo que pode ser capaz de dar uma resposta mais direta. Abordagens geralmente caem em dois campos: incluindo uma contagem de bytes / caracteres no início da resposta (o receptor simplesmente lê-se que muitos bytes / caracteres) ou então usando um marcador para delimitar o final da resposta (o receptor lê até receber o delimitador).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top