2011-10-25 12 views
1

私は、フォームプロジェクトを介して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; 
        } 
       } 

      } 
     } 
    } 

答えて

0

Telnet Authentication Optionは、「暗号化を使用すべきかどうか、および資格情報を転送する必要があるかどうかを含め、認証タイプとモードを交渉するための汎用的な方法として、Telnetプロトコルに認証オプションを指定します。」であるsource

TelnetでNTLM認証セッションを記述するMSDNには、exampleがあります。

関連する問題