Бездомный байт данных в согласовании telnet. Откуда это? - PullRequest
1 голос
/ 25 октября 2011

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

Я застрял. Может кто-нибудь помочь мне понять, почему эта вещь автоматически отправляет байт данных из 37? Это то, что я обнаружил при использовании wireshark для прослушивания пакетов. Раздел Void Parsetelnet - это место, где происходит передача.

Использование Wireshark Я не вижу ни одного экземпляра сервера, запрашивающего опцию аутентификации. Так что я заблудился относительно того, откуда класс получает байт 37. Мне нужно, чтобы он не отправлял это. Вот класс

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net.Sockets;

    namespace STC_Control
    {
        enum Verbs
        {
            WILL = 251,
            WONT = 252,
            DO = 253,
            DONT = 254,
            IAC = 255
        }

        enum Options
        {
            SGA = 3
        }

        class TelnetConnection
        {
            TcpClient tcpSocket;

            int TimeOutMs = 100;

            public TelnetConnection(string Hostname, int Port)
            {
                tcpSocket = new TcpClient(Hostname, Port);

            }

            public void WriteLine(string cmd)
            {
                Write(cmd + "\n");
            }

            public void Write(string cmd)
            {
                if (!tcpSocket.Connected) return;
                byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("\0xFF", "\0xFF\0xFF"));
                tcpSocket.GetStream().Write(buf, 0, buf.Length);
            }

            public string Read()
            {

                if (!tcpSocket.Connected) return null;

                    StringBuilder sb = new StringBuilder();

                    do
                    {
                        ParseTelnet(sb);
                        System.Threading.Thread.Sleep(TimeOutMs);
                    } while (tcpSocket.Available > 0);
                    return sb.ToString();

            }

            public bool IsConnected
            {
                get { return tcpSocket.Connected; }
            }

            void ParseTelnet(StringBuilder sb)
            {
                while (tcpSocket.Available > 0)
                {
                    int input = tcpSocket.GetStream().ReadByte();
                    switch (input)
                    {
                        case -1:
                            break;
                        case (int)Verbs.IAC:
                            // interpret as command
                            int inputverb = tcpSocket.GetStream().ReadByte();
                            if (inputverb == -1) break;
                            switch (inputverb)
                            {
                                case (int)Verbs.IAC:
                                    //literal IAC = 255 escaped, so append char 255 to string
                                    sb.Append(inputverb);
                                    break;
                                case (int)Verbs.DO:
                                case (int)Verbs.DONT:
                                case (int)Verbs.WILL:
                                case (int)Verbs.WONT:
                                    // reply to all commands with "WONT", unless it is SGA (suppres go ahead)
                                    int inputoption = tcpSocket.GetStream().ReadByte();
                                    if (inputoption == -1) break;
                                    tcpSocket.GetStream().WriteByte((byte)Verbs.IAC);
                                    if (inputoption == (int)Options.SGA)
                                        tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WILL : (byte)Verbs.DO);
                                    else
                                        tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WONT : (byte)Verbs.DONT);
                                    tcpSocket.GetStream().WriteByte((byte)inputoption);
                                    break;
                                default:
                                    break;
                            }
                            break;
                        default:
                            sb.Append((char)input);
                            break;
                    }
                }

            }
        }
    }

1 Ответ

0 голосов
/ 25 октября 2011

Параметр Telnet Authentication «определяет параметр проверки подлинности для протокола Telnet в качестве универсального метода для согласования типа и режима проверки подлинности, включая вопрос о том, следует ли использовать шифрование и следует ли пересылать учетные данные». источник

На MSDN есть пример , описывающий сеанс аутентификации NTLM через Telnet.

...