Pergunta

Usando um StreamWriter para gravar em um NetworkStream, e uma StreamReader para ler a resposta. O aplicativo está enviando comandos e respostas de leitura para um servidor de notícias.

código simplificado (manipulação de erro sans, etc.):

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

Os blocos de código em que a última linha, presumivelmente esperando que o fluxo de rede para enviar uma resposta.

posso evitar pendurar o aplicativo, definindo um loop de tempo limite usando serverReader.Peek(), mas vou sempre tempo limite; Eu nunca obter uma resposta.

Se eu telnet para o servidor ea porta direta e digite os comandos, recebo uma resposta imediata.

Se eu chamar serverWriter.Flush() explicitamente, em vez de usar a propriedade AutoFlush, eu ainda bloquear e nunca obter uma resposta.

Todas as ideias por que eu não estou recebendo uma resposta para o servidor usando esta abordagem?

Obrigado!

Resolvido:

O código acima faz trabalho para mim, então eu fui para trás e construída sobre esse código para o código que não iria funcionar.

No código que trava, eu ainda estava usando o loop de tempo limite com serverReader.Peek (). Peek () sempre retorna-1, embora não haja dados na memória intermédia para ler !! Substituindo o loop Peek () com uma chamada de bloqueio para ReadLine () resolve o meu problema.

Eu coloquei o circuito de tempo limite em originalmente porque o aplicativo é multi-threaded, e eu não deseja bloquear. Vou ter que voltar a esta questão e ver como eu posso resolver o timing fio sem usar Peek ().

Obrigado a todos, boas respostas!

Foi útil?

Solução 3

O código acima faz trabalho para mim, então eu fui para trás e construída sobre esse código para o código que não iria funcionar.

No código que trava, eu ainda estava usando o loop de tempo limite com serverReader.Peek (). Peek () sempre retorna-1, embora não haja dados na memória intermédia para ler !! Substituindo o loop Peek () com uma chamada de bloqueio para ReadLine () resolve o meu problema.

Eu coloquei o circuito de tempo limite em originalmente porque o aplicativo é multi-threaded, e eu não deseja bloquear. Vou ter que voltar a esta questão e ver como eu posso resolver o timing fio sem usar Peek ().

Obrigado a todos, boas respostas!

Outras dicas

Eu duvido que ele é o StreamWriter esse é o problema ... mas há uma maneira simples de descobrir. Baixar WireShark e ver o que é realmente indo e vindo na rede. Essa é de longe a maneira mais simples de descobrir o que está acontecendo.

Tente "AUTHINFO usuário username \ r \ n". O RFC diz linhas de comando NNTP deve ser terminado por um CR-LF.

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