Frage

Mit einem StreamWriter zu einem NetworkStream zu schreiben, und ein StreamReader die Antwort zu lesen. Die App ist Befehle und Lese Antworten auf einen Newsserver gesendet wird.

Vereinfachte Code (ohne Fehlerbehandlung, usw.):

tcpClient = new TcpClient();
tcpClient.Connect(Name, Port);

networkStream = tcpClient.GetStream();
serverReader = new StreamReader(networkStream, Encoding.Default);
serverWriter = new StreamWriter(networkStream, Encoding.ASCII) {
                     AutoFlush = true
                   };

// reads the server's response to the connect:  "200 news.newsserver.com"
// commenting out these lines doesn't solve the problem
while (serverReader.Peek() > -1) {
    serverReader.ReadLine();
}

serverWriter.WriteLine("authinfo user username");

// expect response "381 more authentication required", but code just blocks
string response = serverReader.ReadLine();

Die Codeblocks in der letzten Zeile warten, vermutlich für den Netzstrom eine Antwort zu senden.

kann ich vermeiden, dass die App hängen durch einen Timeout-Schleife Einstellung serverReader.Peek(), aber ich werde immer Timeout; Ich habe nie eine Antwort.

Wenn ich Telnet an den Server und den Port direkt und geben Sie die Befehle, erhalte ich eine sofortige Antwort.

Wenn ich serverWriter.Flush() explizit aufrufen, anstatt die AutoFlush Eigenschaft verwendet wird, habe ich noch blockieren und nie eine Antwort erhalten.

Irgendwelche Ideen, warum ich nicht eine Antwort auf den Server mit diesem Ansatz zu bekommen?

Danke!

Entschlossen:

Der obige Code hat Arbeit für mich, also ging ich zurück, und diesen Code, um den Code gebaut, die nicht funktionieren würde.

In dem Code, der hängt, war ich immer noch die Timeout-Schleife mit serverReader.Peek () verwenden. Peek () gibt immer -1, obwohl es Daten im Puffer zu lesen !! Ersetzen der Peek () Schleife mit einem blockierenden Aufruf zu Readline () löst mein Problem.

Ich habe die Timeout-Schleife in ursprünglich, weil die App ist multi-threaded, und ich wollte nicht blockieren. Ich werde diese Frage zu überdenken und sehen, wie ich den Thread Timing lösen kann Peek ohne ().

Danke alle, gute Antworten!

War es hilfreich?

Lösung 3

Der obige Code hat Arbeit für mich, also ging ich zurück, und diesen Code, um den Code gebaut, die nicht funktionieren würde.

In dem Code, der hängt, war ich immer noch die Timeout-Schleife mit serverReader.Peek () verwenden. Peek () gibt immer -1, obwohl es Daten im Puffer zu lesen !! Ersetzen die Peek () Schleife mit einem blockierenden Aufruf zu Readline () löst mein Problem.

Ich habe die Timeout-Schleife in ursprünglich, weil die App ist multi-threaded, und ich wollte nicht blockieren. Ich werde diese Frage zu überdenken und sehen, wie ich ohne die Verwendung von Peek den Faden Timing auflösen kann ().

Danke alle, gute Antworten!

Andere Tipps

Ich bezweifle, dass es die StreamWriter ist das ist das Problem ... aber es ist ein einfacher Weg, um herauszufinden. Laden Sie Wireshark sehen was ist wirklich kommen und gehen im Netzwerk. Das ist bei weitem der einfachste Weg, um herauszufinden, was los ist.

Versuchen "authinfo Benutzer Benutzername \ r \ n". Der RFC sagt NNTP-Befehlszeilen von einem CR-LF beendet werden muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top