Domanda

I utilizzare classe TcpClient per implementare una connessione telnet. Quello che non so è come determinare la fine della risposta. Sembra che una volta di proprietà DataAvailable è vero, ho letto i dati da Stream e DataAvailable viene poi temporaneamente impostata su false, mentre tampone viene riempito con un altro pezzo di dati, ma penso che è tutto leggere e andare via. Come faccio a garantire che tutte le risposta è stata letta?

Mi potrebbe consigliare come modificare il frammento di codice qui sotto per fare questo lavoro in modo corretto. Funziona correttamente quando faccio un passo attraverso il codice perché c'è un sacco di tempo per tutta risposta da recuperare. Apprezzare il vostro aiuto.

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;
}
È stato utile?

Soluzione

Con connessioni TCP per applicazioni come Telnet non esiste tale concetto come la fine della trasmissione. Troverete spesso client telnet che inviano ogni tasto premere uno alla volta come l'utente li inserisce e tocca al server per decidere quando agire, normalmente quando si ottiene un avanzamento riga. Altri client possono tamponare fino a pochi client tasti premuti e mandarli tutti in una volta.

Per il look della vostra applicazione si dovrebbe essere alla ricerca di avanzamenti di riga per indicare la fine di una trasmissione.

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

Altri suggerimenti

Non credo che sia una buona idea usare DataAvailable per questo scopo. La fine della vostra risposta è qualunque sia il vostro protocollo dice che è.

E 'meglio utilizzare le chiamate di blocco come Leggi per leggere le tue cose, e utilizzare qualsiasi protocollo che hai stabilito per determinare Per saperne di più, e quanto. Potrebbe essere che non tutti i dati che si desidera viene restituito, perché Leggi non restituisce quando tutti i dati vengono letti, ma quando alcuni dati vengono letti, quindi è necessario verificare quanto è stato letto.

Se il protocollo è Telnet, è probabile che desidera rispondere a ogni singolo byte ricevuto, come con un terminale che si desidera eco o comandi di processo o meno quello.

DataAvailable è forse adatto a controllare se un Leggi bloccherebbe quando viene chiamato (che tornerà con tutto ciò che è nel buffer), ma rende il vostro ciclo meno semplice.

Si tratta di una connessione telnet reale, vale a dire vi state collegando un server telnet o da 'telnet' si fa sul serio 'socket TCP / IP'?

In primo luogo determinare se il server cade la connessione quando la trasmissione è completata. Se è così, si può semplicemente leggere fino alla fine del flusso. In caso contrario, se non, si sta andando ad avere per utilizzare uno spunto nei dati per determinare se la lettura è completa. Diversi protocolli di lavoro in modo diverso a questo proposito, quindi se si potesse illuminarci al protocollo potremmo essere in grado di dare una risposta più diretta. Approcci rientrano generalmente in due campi: tra cui un conteggio di byte / caratteri all'inizio della risposta (il ricevitore legge semplicemente che molti byte / caratteri) o altro con un pennarello per delimitare la fine della risposta (il ricevitore legge fino a ricevere la delimitatore).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top