telnet协商中的杂散数据字节。它来自哪里?

时间:2011-10-25 04:33:21

标签: c# visual-studio-2010 networking telnet tcpclient

我正在使用minimalistic 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 :(得分:0)

Telnet Authentication Option“指定Telnet协议的身份验证选项,作为协商身份验证类型和模式的通用方法,包括是否应使用加密以及是否应转发凭据。”source < / p>

MSDN上有一个example,用于描述通过Telnet进行的NTLM身份验证会话。