2011-10-25 1 views
1

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

Я застрял. Может кто-нибудь помочь мне понять, почему эта вещь автоматически отправляет байт данных из 37? Это то, что я обнаружил при использовании wirehark для обнюхивания пакетов. Раздел 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; 
        } 
       } 

      } 
     } 
    } 

ответ

0

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

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

Смежные вопросы