Как программно бороться с задержками при подключении к telnet? - PullRequest
1 голос
/ 30 марта 2009

Я использую класс TcpClient для реализации соединения telnet. Чего я не знаю, так это как определить конец ответа. Кажется, что как только свойство DataAvailable имеет значение true, я считываю данные из Stream, а затем DataAvailable временно устанавливается в значение false, когда буфер заполняется другим блоком данных, но я думаю, что все считывается и исчезает. Как мне убедиться, что все ответы прочитаны?

Вы могли бы посоветовать мне, как изменить фрагмент кода ниже, чтобы это работало правильно. Он работает правильно, когда я перебираю код, потому что у меня достаточно времени для получения всего ответа. Ценю вашу помощь.

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;
}

Ответы [ 3 ]

2 голосов
/ 30 марта 2009

Для TCP-соединений для таких приложений, как Telnet, не существует такого понятия, как окончание передачи. Вы часто найдете клиентов telnet, которые отправляют каждое нажатие клавиши по одному, когда пользователь вводит их, и сервер сам решает, когда следует предпринять действие, обычно, когда он получает перевод строки. Другие клиенты могут буферизовать несколько нажатий клавиш клиента и отправить их все сразу.

Судя по внешнему виду вашего приложения, вы должны искать переводы строк, чтобы указать конец передачи.

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 голосов
/ 30 марта 2009

Является ли это действительным соединением telnet, т.е. вы подключаетесь к серверу telnet или под словом telnet вы действительно подразумеваете «сокет TCP / IP»?

Сначала определите, прерывает ли сервер соединение после завершения передачи. Если это так, вы можете просто прочитать до конца потока. В противном случае, если нет, вам придется использовать метку в данных, чтобы определить, завершено ли чтение. В этом отношении разные протоколы работают по-разному, поэтому, если бы вы могли рассказать нам о протоколе, мы могли бы дать более прямой ответ. Подходы обычно делятся на два лагеря: включая количество байтов / символов в начале ответа (получатель просто читает столько байтов / символов) или использование маркера для определения конца ответа (получатель читает до получения ограничитель).

0 голосов
/ 30 марта 2009

Не думаю, что для этой цели целесообразно использовать DataAvailable. Конец вашего ответа - то, что говорится в вашем протоколе.

Лучше использовать блокирующие вызовы, такие как «Чтение», чтобы читать ваши материалы, и использовать любой протокол, который вы установили, чтобы определить, читать больше и сколько. Может случиться так, что возвращаются не все данные, которые вы хотите, потому что Read не возвращается, когда все ваши данные читаются, но когда некоторые данные читаются, вам нужно проверить, сколько было прочитано.

Если ваш протокол - Telnet, вы, вероятно, захотите отвечать на каждый полученный байт, как с терминалом, который вы хотите выводить на экран или обрабатывать команды, а что нет.

DataAvailable, возможно, подходит для проверки, будет ли блокироваться чтение при вызове (он вернется с тем, что находится в буфере), но это сделает ваш цикл менее простым.

...