c # TcpClient не может прочитать действительный ответ от успешно подключенного сервера / устройства telnet - PullRequest
0 голосов
/ 13 декабря 2010

В настоящее время я работаю над сетевым проектом, который включает в себя подключение к tcp-серверам и некоторым устройствам.В течение долгого времени я успешно использовал приведенный ниже код для отправки команды tcp и получения ответов для некоторых моделей устройств, но когда я пробую это для Windows Telnet Server 2003 и устройства Fortigate, даже если я могу успешно создать соединение tcp, все, что я могу получить в ответэто какой-то набор символов, например ??% ?????? '????.

Моя функция для получения ответа:

   private string receive()
    {
        StringBuilder sbReadBuffer = new StringBuilder();
        bool isFinished = false;
        NetworkStream ns = tcpClient.GetStream();
        DateTime lastConTime = DateTime.Now;

        while (!isFinished)
        {
            if (!ns.DataAvailable)
            {
                Thread.Sleep(200);

                if ((DateTime.Now - lastConTime).TotalSeconds > Prms.tcpSendReceiveTimeoutInSeconds)
                    break;
                else
                    continue;
            }

            Int32 receiveCount = ns.Read(receiveBuffer, 0, receiveBuffer.Length);
            String received = new ASCIIEncoding().GetString(receiveBuffer, 0, receiveCount);

            sbReadBuffer.Append(received);

            foreach (String terminaterToken in terminaterTokens)
                if (sbReadBuffer.ToString().EndsWith(terminaterToken))
                    isFinished = true;

            lastConTime = DateTime.Now;
        }

        return sbReadBuffer.ToString();
    }
}

и для создания соединения tcp и получения вызовафункция:

        TcpClient tcpClient = new TcpClient()
    {
        SendTimeout = 10000,
        ReceiveTimeout = 10000
    };

    tcpClient.Connect(wanIp, 23);
    String initialMessage = receive();

Я проверил полученные сообщения для устройств, код которых выше работает без проблем, и я понял, что для каждой отдельной модели устройства первоначальный ответ всегда что-то вроде "??% ??????«????»но за ним следовали логические ответы, такие как «добро пожаловать» против

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

1 Ответ

1 голос
/ 22 декабря 2010

Проблемы, вызывающие "??% ??"символы из-за опции telnet IAC.Возвращая значения ответа, поскольку IAC имеет большие десятичные коды, чем 255. Дополнительную информацию о IAC можно получить по адресу

support.microsoft.com / kb / 231866

Проблема со значениями IAC заключается в том, чтокогда вы пытаетесь проанализировать ответы с C # tcpClient, используя стандартный код

            byte[] sendBuffer = new ASCIIEncoding().GetBytes(str + strNewLine);
            tcpClient.GetStream().Write(sendBuffer, 0, sendBuffer.Length);

, код выдает вышеуказанные значения «??%» при получении значений IAC.

Чтобы предотвратить это и обработать значения IAC, я провел небольшое исследование и нашел отличный проект telnet по адресу http://www.codeproject.com/KB/IP/TelnetSocket.aspx, который прекрасно обрабатывает значения IAC.

Для лучшего понимания обработки значений IAC будет полезна также проверка MinimalisticTelnet исходного кода библиотеки.Я смог получить ответы без проблем с помощью MinimalisticTelnet, но он не смог отправить сообщения для устройств, на которых я работаю, поэтому я предпочел проект сокета telnet.Но я настоятельно рекомендую изучить исходный код MinimalisticTelnet для лучшего понимания.

...