• 三个Telnet链接类----来自网络


    声明:下面的三个类都是从网上找到的,具体出处不详,哪个类的好坏性能优劣自己把握,可参考使用。拒绝使用商业用途,如产生版权纠纷和本人无关。

    一:Telnet链接网络设备,在网上看到C#Telnet连接网络设备的类,程序为命令行程序,具体代码如下:

    文件名:Program.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    using System.Net.Sockets;
    using System.Net;
    
    namespace ConsoleTelnet
    {
        public class TelNet
        {
            #region 一些telnet 的数据定义,先没看懂没关系
            /// <summary>   
            /// 标志符,代表是一个TELNET 指令   
            /// </summary>   
            readonly Char IAC = Convert.ToChar(255);
            /// <summary>   
            /// 表示一方要求另一方使用,或者确认你希望另一方使用指定的选项。   
            /// </summary>   
            readonly Char DO = Convert.ToChar(253);
            /// <summary>   
            /// 表示一方要求另一方停止使用,或者确认你不再希望另一方使用指定的选项。   
            /// </summary>   
            readonly Char DONT = Convert.ToChar(254);
            /// <summary>   
            /// 表示希望开始使用或者确认所使用的是指定的选项。   
            /// </summary>   
            readonly Char WILL = Convert.ToChar(251);
            /// <summary>   
            /// 表示拒绝使用或者继续使用指定的选项。   
            /// </summary>   
            readonly Char WONT = Convert.ToChar(252);
            /// <summary>   
            /// 表示后面所跟的是对需要的选项的子谈判   
            /// </summary>   
            readonly Char SB = Convert.ToChar(250);
            /// <summary>   
            /// 子谈判参数的结束   
            /// </summary>   
            readonly Char SE = Convert.ToChar(240);
            const Char IS = '0';
            const Char SEND = '1';
            const Char INFO = '2';
            const Char VAR = '0';
            const Char VALUE = '1';
            const Char ESC = '2';
            const Char USERVAR = '3';
            /// <summary>   
            ////// </summary>   
            byte[] m_byBuff = new byte[100000];
            /// <summary>   
            /// 收到的控制信息   
            /// </summary>   
            private ArrayList m_ListOptions = new ArrayList();
            /// <summary>   
            /// 存储准备发送的信息   
            /// </summary>   
            string m_strResp;
            /// <summary>   
            /// 一个Socket 套接字   
            /// </summary>   
            private Socket s;
            #endregion
            /// <summary>   
            /// 主函数   
            /// </summary>   
            /// <param name="args"></param>   
            static void Main(string[] args)
            {
                //实例化这个对象   
                TelNet p = new TelNet();
                //启动socket 进行telnet 链接   
                p.doSocket();
            }
            /// <summary>   
            /// 启动socket 进行telnet 操作   
            /// </summary>   
            private void doSocket()
            {
                //获得链接的地址,可以是网址也可以是IP   
                Console.WriteLine("Server Address:");
                //解析输入,如果是一个网址,则解析成ip   
                IPAddress import = GetIP(Console.ReadLine());
    
                //获得端口号   
                Console.WriteLine("Server Port:");
                int port = int.Parse(Console.ReadLine());
                //建立一个socket 对象,使用IPV4,使用流进行连接,使用tcp/ip协议   
                s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                //获得一个链接地址对象(由IP 地址和端口号构成)   
                IPEndPoint address = new IPEndPoint(import, port);
                /* 
                * 说明此socket 不是处于阻止模式 
                * 
                * msdn 对阻止模式的解释: 
                * ============================================================ 
                * 如果当前处于阻止模式,并且进行了一个并不立即完成的方法调用, 
                * 则应用程序将阻止执行,直到请求的操作完成后才解除阻止。 
                * 如果希望在请求的操作尚未完成的情况下也可以继续执行, 
                * 请将Blocking 属性更改为false。Blocking 属性对异步方法无效。 
                * 如果当前正在异步发送和接收数据,并希望阻止执行, 
                * 请使用ManualResetEvent 类。 
                * ============================================================ 
                */
                s.Blocking = false;
                /* 
                * 开始一个对远程主机连接的异步请求, 
                * 因为Telnet 使用的是TCP 链接,是面向连接的, 
                * 所以此处BeginConnect 会启动一个异步请求, 
                (本文下载自防锈油文档综合站www.hthrt.com。转载请说明出处) 
                * 请求获得与给的address 的连接 
                * 
                * 此方法的第二个函数是一个类型为AsyncCallback 的委托 
                * 
                * 这个AsyncCallback msdn 给出的定义如下 
                * =================================================================== 
                * 使用AsyncCallback 委托在一个单独的线程中处理异步操作的结果。A 
                * syncCallback 委托表示在异步操作完成时调用的回调方法。 
                * 回调方法采用IAsyncResult 参数,该参数随后可用来获取异步操作的结果。 
                * =================================================================== 
                * 这个方法里的委托实际上就是当异步请求有回应了之后,执行委托的方法. 
                * 委托里的参数,实际上就是BeginConnect 的第三个参数, 
                * 此处为socket 本身 
                *(本文下载自防锈油文档综合站www.hthrt.com。转载请说明出处) 
                * 我比较懒,写了一个匿名委托,实际上跟AsyncCallback 效果一个样. 
                * 
                */
                s.BeginConnect(
                address,
                delegate(IAsyncResult ar)
                /* 
                * 此处为一个匿名委托, 
                * 实际上等于 
                * 建立一个AsyncCallback 对象,指定后在此引用一个道理 
                * 
                * ok 这里的意义是, 
                * 当远程主机连接的异步请求有响应的时候,执行以下语句 
                */
                {
                    try
                    {
                        //获得传入的对象(此处对象是BeginConnect 的第三个参数)   
                        Socket sock1 = (Socket)ar.AsyncState;
    
                        /* 
                        * 如果Socket 在最近操作时连接到远程资源,则为true;否则为false。 
                        * 
                        * 以下是MSDN 对Connected 属性的备注信息 
                        * 
                        ========================================================================= 
                        * Connected 属性获取截止到最后的I/O 操作时Socket 的连接状态。 
                        * 当它返回false 时,表明Socket 要么从未连接,要么已断开连接。 
                        * 
                        * Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态, 
                        * 请进行非阻止、零字节的Send 调用。 
                        (本文下载自防锈油文档综合站www.hthrt.com。转载请说明出处) 
                        * 如果该调用成功返回或引发WAEWOULDBLOCK 错误代码(10035), 
                        * 则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。 
                        * 
                        ========================================================================= 
                        */
                        if (sock1.Connected)
                        {
                            AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
                            /* 
                            * 此处没再用匿名委托的原因是, 
                            * 一个匿名委托嵌套一个匿名委托,我自己思路跟不上来了... 
                            * 
                            * ok,这里是当Connected 为true 时, 
                            * 使用BeginReceive 方法 
                            * 开始接收信息到m_byBuff(我们在类中定义的私有属性) 
                            * 
                            * 以下是MSDN 对BeginReceive 的一些说明 
                            * 
                            ========================================================================= 
                            * 异步BeginReceive 操作必须通过调用EndReceive 方法来完成。 
                            * 通常,该方法由callback 委托调用。此方法在操作完成前不会进入阻止状态。* 若要 
                            一直阻塞到操作完成时为止,请使用Receive 方法重载中的一个。 
                            * 若要取消挂起的BeginReceive,请调用Close 方法。* 
                            ========================================================================== 
                            * 
                            * 当接收完成之后,他们就会调用OnRecievedData 方法 
                            * 我在recieveData 所委托的方法OnRecievedData 中调用了sock.EndReceive(ar); 
                            */
                            sock1.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock1);
                        }
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("初始化接收信息出错:" + ex.Message);
                    }
                },
                s);
                //此处是为了发送指令而不停的循环   
                while (true)
                {
                    //发送读出的数据   
                    DispatchMessage(Console.ReadLine());
                    //因为每发送一行都没有发送回车,故在此处补上   
                    DispatchMessage("
    ");
                }
            }
            /// <summary>   
            /// 当接收完成后,执行的方法(供委托使用)   
            /// </summary>   
            /// <param name="ar"></param>   
            private void OnRecievedData(IAsyncResult ar)
            {
                //从参数中获得给的socket 对象   
                Socket sock = (Socket)ar.AsyncState;
                /* 
                * EndReceive 方法为结束挂起的异步读取 
                * (貌似是在之前的beginReceive 收到数据之后, 
                * socket 只是"挂起",并未结束) 
                * 之后返回总共接收到的字流量 
                * 
                * 以下是MSDN 给出的EndReceive 的注意事项 
                * 
                ========================================================================================= 
                * EndReceive 方法完成在BeginReceive 方法中启动的异步读取操作。 
                * 
                * 在调用BeginReceive 之前,需创建一个实现AsyncCallback 委托的回调方法。 
                * 该回调方法在单独的线程中执行并在BeginReceive 返回后由系统调用。 
                * 回调方法必须接受BeginReceive 方法所返回的IAsyncResult 作为参数。 
                * 
                * 在回调方法中,调用IAsyncResult 的AsyncState 方法以获取传递给BeginReceive 方法的状态对象。 
                * 从该状态对象提取接收Socket。在获取Socket 之后,可以调用EndReceive 方法以成功完成读取操作, 
                * 并返回已读取的字节数。 
                * 
                * EndReceive 方法将一直阻止到有数据可用为止。 
                * 如果您使用的是无连接协议,则EndReceive 将读取传入网络缓冲区中第一个排队的可用数据报。 
                * 如果您使用的是面向连接的协议,则EndReceive 方法将读取所有可用的数据, 
                * 直到达到BeginReceive 方法的size 参数所指定的字节数为止。 
                * 如果远程主机使用Shutdown 方法关闭了Socket 连接,并且所有可用数据均已收到, 
                * 则EndReceive 方法将立即完成并返回零字节。 
                * 
                * 若要获取接收到的数据,请调用IAsyncResult 的AsyncState 方法, 
                * 然后提取所产生的状态对象中包含的缓冲区。 
                * 
                * 若要取消挂起的BeginReceive,请调用Close 方法。 
                * 
                ========================================================================================= 
                */
                int nBytesRec = sock.EndReceive(ar);
                //如果有接收到数据的话   
                if (nBytesRec > 0)
                {
                    //将接收到的数据转个码,顺便转成string 型   
                    string sRecieved = Encoding.GetEncoding("utf-8").GetString(m_byBuff, 0, nBytesRec);
    
                    //声明一个字符串,用来存储解析过的字符串   
                    string m_strLine = "";
                    //遍历Socket 接收到的字符   
                    /* 
                    * 此循环用来调整linux 和windows 在换行上标记的区别 
                    * 最后将调整好的字符赋予给m_strLine 
                    */
                    for (int i = 0; i < nBytesRec; i++)
                    {
                        Char ch = Convert.ToChar(m_byBuff[i]);
                        switch (ch)
                        {
                            case '
    ':
                                m_strLine += Convert.ToString("
    ");
                                break;
                            case '
    ':
                                break;
                            default:
                                m_strLine += Convert.ToString(ch);
                                break;
                        }
                    }
                    try
                    {
                        //获得转义后的字符串的长度   
                        int strLinelen = m_strLine.Length;
                        //如果长度为零   
                        if (strLinelen == 0)
                        {
                            //则返回"
    " 即回车换行   
                            m_strLine = Convert.ToString("
    ");
                        }
                        //建立一个流,把接收的信息(转换后的)存进mToProcess 中   
                        Byte[] mToProcess = new Byte[strLinelen];
                        for (int i = 0; i < strLinelen; i++)
                            mToProcess[i] = Convert.ToByte(m_strLine[i]);
                        // Process the incoming data   
                        //对接收的信息进行处理,包括对传输过来的信息的参数的存取和   
                        string mOutText = ProcessOptions(mToProcess);
                        mOutText = ConvertToGB2312(mOutText);
    
                        //解析命令后返回显示信息(即除掉了控制信息)   
                        if (mOutText != "")
                            Console.Write(mOutText);
                        // Respond to any incoming commands   
                        //接收完数据,处理完字符串数据等一系列事物之后,开始回发数据   
                        RespondToOptions();
                    }
                    catch (Exception ex)
                    {
                        throw new Exception("接收数据的时候出错了! " + ex.Message);
                    }
                }
                else// 如果没有接收到任何数据的话   
                {
                    // 输出关闭连接   
                    Console.WriteLine("Disconnected", sock.RemoteEndPoint);
                    // 关闭socket   
                    sock.Shutdown(SocketShutdown.Both);
                    sock.Close();
                    Console.Write("Game Over");
                    Console.ReadLine();
                }
            }
            /// <summary>   
            /// 发送数据的函数   
            /// </summary>   
            private void RespondToOptions()
            {
                try
                {
                    //声明一个字符串,来存储接收到的参数   
                    string strOption;
                    /* 
                    * 此处的控制信息参数,是之前接受到信息之后保存的 
                    * 例如255 253 23 等等 
                    * 具体参数的含义需要去查telnet 协议 
                    */
                    for (int i = 0; i < m_ListOptions.Count; i++)
                    {
                        //获得一个控制信息参数   
                        strOption = (string)m_ListOptions[i];
                        //根据这个参数,进行处理   
                        ArrangeReply(strOption);
                    }
                    DispatchMessage(m_strResp);
                    m_strResp = "";
                    m_ListOptions.Clear();
                }
                catch (Exception ers)
                {
                    Console.WriteLine("错错了,在回发数据的时候" + ers.Message);
                }
            }
            /// <summary>   
            /// 解析接收的数据,生成最终用户看到的有效文字,同时将附带的参数存储起来   
            /// </summary>   
            /// <param name="m_strLineToProcess">收到的处理后的数据</param>   
            /// <returns></returns>   
            private string ProcessOptions(byte[] m_strLineToProcess)
            {
                string m_DISPLAYTEXT = "";
                string m_strTemp = "";
                string m_strOption = "";
                string m_strNormalText = "";
                bool bScanDone = false;
                int ndx = 0;
                int ldx = 0;
                char ch;
                try
                {
                    //把数据从byte[] 转化成string   
                    for (int i = 0; i < m_strLineToProcess.Length; i++)
                    {
                        Char ss = Convert.ToChar(m_strLineToProcess[i]);
                        m_strTemp = m_strTemp + Convert.ToString(ss);
                    }
                    //此处意义为,当没描完数据前,执行扫描   
                    while (bScanDone != true)
                    {
                        //获得长度   
                        int lensmk = m_strTemp.Length;
                        //之后开始分析指令,因为每条指令为255 开头,故可以用此来区分出每条指令   
                        ndx = m_strTemp.IndexOf(Convert.ToString(IAC));
                        //此处为出错判断,本无其他含义   
                        if (ndx > lensmk)
                            ndx = m_strTemp.Length;
                        //此处为,如果搜寻到IAC 标记的telnet 指令,则执行以下步骤   
                        if (ndx != -1)
                        {
                            #region 如果存在IAC 标志位
                            // 将标志位IAC 的字符赋值给最终显示文字   
                            m_DISPLAYTEXT += m_strTemp.Substring(0, ndx);
                            // 此处获得命令码   
                            ch = m_strTemp[ndx + 1];
                            //如果命令码是253(DO) 254(DONT) 521(WILL) 252(WONT) 的情况下   
                            if (ch == DO || ch == DONT || ch == WILL || ch == WONT)
                            {
                                //将以IAC 开头3个字符组成的整个命令存储起来   
                                m_strOption = m_strTemp.Substring(ndx, 3);
                                m_ListOptions.Add(m_strOption);
                                // 将标志位IAC 的字符赋值给最终显示文字   
                                m_DISPLAYTEXT += m_strTemp.Substring(0, ndx);
                                //将处理过的字符串删去   
                                string txt = m_strTemp.Substring(ndx + 3);
                                m_strTemp = txt;
                            }
                            //如果IAC 后面又跟了个IAC (255)   
                            else if (ch == IAC)
                            {
                                //则显示从输入的字符串头开始,到之前的IAC 结束   
                                m_DISPLAYTEXT = m_strTemp.Substring(0, ndx);
                                //之后将处理过的字符串排除出去   
                                m_strTemp = m_strTemp.Substring(ndx + 1);
                            }
                            //如果IAC 后面跟的是SB(250)   
                            else if (ch == SB)
                            {
                                m_DISPLAYTEXT = m_strTemp.Substring(0, ndx);
                                ldx = m_strTemp.IndexOf(Convert.ToString(SE));
                                m_strOption = m_strTemp.Substring(ndx, ldx);
                                m_ListOptions.Add(m_strOption);
                                m_strTemp = m_strTemp.Substring(ldx);
                            }
                            #endregion
                        }
                        //若字符串里已经没有IAC 标志位了   
                        else
                        {
                            //显示信息累加上m_strTemp 存储的字段   
                            m_DISPLAYTEXT = m_DISPLAYTEXT + m_strTemp;
                            bScanDone = true;
                        }
                    }
                    //输出人看到的信息   
                    m_strNormalText = m_DISPLAYTEXT;
                }
                catch (Exception eP)
                {
                    throw new Exception("解析传入的字符串错误:" + eP.Message);
                }
                return m_strNormalText;
            }
            /// <summary>   
            /// 获得IP 地址   
            /// </summary>   
            /// <param name="import"></param>   
            /// <returns></returns>   
            private static IPAddress GetIP(string import)
            {
                //IPHostEntry IPHost = Dns.GetHostEntry(import);
                //IPHostEntry IPHost = Dns.GetHostByName(import);
                IPAddress[] IPHost = Dns.GetHostAddresses(import);
    
                //return IPHost.AddressList[0];
                return IPHost[0];
    
                //return IPHost;
            }
            #region magic Function
            //解析传过来的参数,生成回发的数据到m_strResp   
            private void ArrangeReply(string strOption)
            {
                try
                {
                    Char Verb;
                    Char Option;
                    Char Modifier;
                    Char ch;
                    bool bDefined = false;
                    //排错选项,无啥意义   
                    if (strOption.Length < 3) return;
                    //获得命令码   
                    Verb = strOption[1];
                    //获得选项码   
                    Option = strOption[2];
                    //如果选项码为回显(1) 或者是抑制继续进行(3)   
                    if (Option == 1 || Option == 3)
                    {
                        bDefined = true;
                    }
                    // 设置回发消息,首先为标志位255   
                    m_strResp += IAC;
                    //如果选项码为回显(1) 或者是抑制继续进行(3) ==true   
                    if (bDefined == true)
                    {
                        #region 继续判断
                        //如果命令码为253 (DO)   
                        if (Verb == DO)
                        {
                            //我设置我应答的命令码为251(WILL) 即为支持回显或抑制继续进行   
                            ch = WILL;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        //如果命令码为254(DONT)   
                        if (Verb == DONT)
                        {
                            //我设置我应答的命令码为252(WONT) 即为我也会"拒绝启动" 回显或抑制继续进行   
                            ch = WONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        //如果命令码为251(WILL)   
                        if (Verb == WILL)
                        {
                            //我设置我应答的命令码为253(DO) 即为我认可你使用回显或抑制继续进行   
                            ch = DO;
                            m_strResp += ch;
                            m_strResp += Option;
                            //break;   
                        }
                        //如果接受到的命令码为251(WONT)   
                        if (Verb == WONT)
                        {
                            //应答我也拒绝选项请求回显或抑制继续进行   
                            ch = DONT;
                            m_strResp += ch;
                            m_strResp += Option;
                            // break;   
                        }
                        //如果接受到250(sb,标志子选项开始)   
                        if (Verb == SB)
                        {
                            /* 
                            * 因为启动了子标志位,命令长度扩展到了4字节, 
                            * 取最后一个标志字节为选项码 
                            * 如果这个选项码字节为1(send) 
                            * 则回发为250(SB 子选项开始) + 获取的第二个字节+ 0(is) + 255(标志位IAC) + 240(SE 子 
                            选项结束) 
                            */
                            Modifier = strOption[3];
                            if (Modifier == SEND)
                            {
                                ch = SB;
                                m_strResp += ch;
                                m_strResp += Option;
                                m_strResp += IS;
                                m_strResp += IAC;
                                m_strResp += SE;
                            }
                        }
                        #endregion
                    }
                    else //如果选项码不是1 或者3   
                    {
                        #region 底下一系列代表,无论你发那种请求,我都不干
                        if (Verb == DO)
                        {
                            ch = WONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        if (Verb == DONT)
                        {
                            ch = WONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        if (Verb == WILL)
                        {
                            ch = DONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        if (Verb == WONT)
                        {
                            ch = DONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        #endregion
                    }
                }
                catch (Exception eeeee)
                {
                    throw new Exception("解析参数时出错:" + eeeee.Message);
                }
            }
            /// <summary>   
            /// 将信息转化成charp[] 流的形式,使用socket 进行发出   
            /// 发出结束之后,使用一个匿名委托,进行接收,   
            /// 之后这个委托里,又有个委托,意思是接受完了之后执行OnRecieveData 方法   
            ///   
            /// </summary>   
            /// <param name="strText"></param>   
            void DispatchMessage(string strText)
            {
                try
                {
                    //申请一个与字符串相当长度的char 流   
                    Byte[] smk = new Byte[strText.Length];
                    for (int i = 0; i < strText.Length; i++)
                    {
                        //解析字符串,将其存储到char 流中去   
                        Byte ss = Convert.ToByte(strText[i]);
                        smk[i] = ss;
                    }
                    //发送char 流,之后发送完毕后执行委托中的方法(此处为匿名委托)   
                    /*MSDN 对BeginSend 的解释 
                    * 
                    ============================================================================================ 
                    =========== 
                    * BeginSend 方法可对在Connect、BeginConnect、Accept 或BeginAccept 方法中建立的远程主机启 
                    动异步发送操作。 
                    * 如果没有首先调用Accept、BeginAccept、Connect 或BeginConnect,则BeginSend 将会引发异常。 
                    * 调用BeginSend 方法将使您能够在单独的执行线程中发送数据。 
                    * 您可以创建一个实现AsyncCallback 委托的回调方法并将它的名称传递给BeginSend 方法。 
                    * 为此,您的state 参数至少必须包含用于通信的已连接或默认Socket。 
                    * 如果回调需要更多信息,则可以创建一个小型类或结构,用于保存Socket 和其他所需的信息。 
                    * 通过state 参数将此类的一个实例传递给BeginSend 方法。 
                    * 回调方法应调用EndSend 方法。 
                    * 当应用程序调用BeginSend 时,系统将使用一个单独的线程来执行指定的回调方法, 
                    * 并阻止EndSend,直到Socket 发送了请求的字节数或引发了异常为止。 
                    * 如果希望在调用BeginSend 方法之后使原始线程阻止,请使用WaitHandle.WaitOne 方法。 
                    * 当需要原始线程继续执行时,请在回调方法中调用T:System.Threading.ManualResetEvent 的Set 方 
                    法。 
                    * 有关编写回调方法的其他信息,请参见Callback 示例。 
                    * 
                    ============================================================================================ 
                    =========== 
                    */
                    IAsyncResult ar2 = s.BeginSend(smk, 0, smk.Length, SocketFlags.None, delegate(IAsyncResult ar)
                    {
                        //当执行完"发送数据" 这个动作后   
                        // 获取Socket 对象,对象从beginsend 中的最后个参数上获得   
                        Socket sock1 = (Socket)ar.AsyncState;
                        if (sock1.Connected)//如果连接还是有效   
                        {
                            //这里建立一个委托   
                            AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
                            /* 
                            * 此处为:开始接受数据(在发送完毕之后-->出自于上面的匿名委托), 
                            * 当接收完信息之后,执行OnrecieveData 方法(由委托传进去), 
                            * 注意,是异步调用 
                            */
                            sock1.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock1);
                        }
                    }, s);
                    /* 
                    * 结束异步发送 
                    * EndSend 完成在BeginSend 中启动的异步发送操作。 
                    * 在调用BeginSend 之前,需创建一个实现AsyncCallback 委托的回调方法。 
                    * 该回调方法在单独的线程中执行并在BeginSend 返回后由系统调用。 
                    * 回调方法必须接受BeginSend 方法所返回的IAsyncResult 作为参数。 
                    * 
                    * 在回调方法中,调用IAsyncResult 参数的AsyncState 方法可以获取发送Socket。 
                    * 在获取Socket 之后,则可以调用EndSend 方法以成功完成发送操作,并返回发送的字节数。 
                    */
                    s.EndSend(ar2);
                }
                catch (Exception ers)
                {
                    Console.WriteLine("出错了,在回发数据的时候:" + ers.Message);
                }
            }
            #endregion
    
            /// <param name="str_origin">必要转换的字符串</param>   
            /// <returns>转换后的字符串</returns>   
            private string ConvertToGB2312(string str_origin)
            {
                char[] chars = str_origin.ToCharArray();
                byte[] bytes = new byte[chars.Length];
                for (int i = 0; i < chars.Length; i++)
                {
                    int c = (int)chars[i];
                    bytes[i] = (byte)c;
                }
                Encoding Encoding_GB2312 = Encoding.GetEncoding("GB2312");
                string str_converted = Encoding_GB2312.GetString(bytes);
                return str_converted;
            }
    
        }
    
    }

    二:Telnet类

    文件名:TelnetClass.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Net;
    using System.Net.Sockets;
    using System.Collections;
    using System.Threading;
    
    namespace EmptyProjectNet40_FineUI.App_Code.Helper
    {
    
        //        //调用方法如下:
        //Telnet p = new Telnet("192.168.1.100", 23, 50);
    
        //if(p.Connect()==false)
        //{
        //  Console.WriteLine("连接失败");
        //  return;
        //}
        ////等待指定字符返回后才执行下一命令
        //p.WaitFor("login:");
        //p.Send("admin");
        //p.WaitFor("password:");
        //p.Send("123456");
        //p.WaitFor(">");
        ////Console.WriteLine(p.SessionLog);
        //Console.WriteLine(p.WorkingData);
        //改进后代码(注意标蓝色的部分):
    
    
    
    
        public class Telnet
        {
            #region telnet的数据定义
            /// <summary>        
            /// 标志符,代表是一个TELNET 指令        
            /// </summary>        
            readonly Char IAC = Convert.ToChar(255);
            /// <summary>        
            /// 表示一方要求另一方使用,或者确认你希望另一方使用指定的选项。
            /// </summary>        
            readonly Char DO = Convert.ToChar(253);
            /// <summary>
            /// 表示一方要求另一方停止使用,或者确认你不再希望另一方使用指定的选项。       
            /// </summary>       
            readonly Char DONT = Convert.ToChar(254);
            /// <summary>
            /// 表示希望开始使用或者确认所使用的是指定的选项。
            /// </summary>
            readonly Char WILL = Convert.ToChar(251);
            /// <summary>
            /// 表示拒绝使用或者继续使用指定的选项。
            /// </summary>
            readonly Char WONT = Convert.ToChar(252);
            /// <summary>
            /// 表示后面所跟的是对需要的选项的子谈判
            /// </summary>
            readonly Char SB = Convert.ToChar(250);
            /// <summary>
            /// 子谈判参数的结束
            /// </summary>
            readonly Char SE = Convert.ToChar(240);
            const Char IS = '0';
            const Char SEND = '1';
            const Char INFO = '2';
            const Char VAR = '0';
            const Char VALUE = '1';
            const Char ESC = '2';
            const Char USERVAR = '3';
            /// <summary> 
            ////// /// </summary>
            byte[] m_byBuff = new byte[100000];
            /// <summary>
            /// 收到的控制信息
            /// </summary>
            private ArrayList m_ListOptions = new ArrayList();
            /// <summary>
            /// 存储准备发送的信息
            /// </summary>
            string m_strResp;
            /// <summary>
            /// 一个Socket套接字
            /// </summary>
            private Socket s;
            #endregion
    
            private IPEndPoint iep;
            private string address;
            private int port;
            private int timeout;
    
            private string strWorkingData = "";     // 保存从服务器端接收到的数据
            private string strFullLog = "";
            //==== 夏春涛 扩充 20110531 ================================================            
    
            private string strWorkingDataX = "";
            //用于获取当前工作的数据内容
    
            public string WorkingData
            {
                get { return strWorkingDataX; }
            }
            //===================================================================
            public Telnet(string Address, int Port, int CommandTimeout)
            {
                address = Address;
                port = Port;
                timeout = CommandTimeout;
            }
    
            /// <summary>        
            /// 启动socket 进行telnet操作        
            /// </summary>       
            public bool Connect()
            {
                
                IPAddress import = GetIP(address);
                //IPAddress import = address;
    
                s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                iep = new IPEndPoint(import, port);
    
                try
                {
                    // Try a blocking connection to the server
                    s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    
                    s.Connect(iep);
    
                    //异步回调
                    AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
                    s.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, s);
    
                    return true;
                }
                catch (Exception)
                {
                    return false;
                }
            }
    
            /// <summary>        
            /// 当接收完成后,执行的方法(供委托使用)       
            /// </summary>      
            /// <param name="ar"></param>       
            private void OnRecievedData(IAsyncResult ar)
            {
                try
                {
                    //从参数中获得给的socket 对象           
                    Socket sock = (Socket)ar.AsyncState;
    
                    //EndReceive方法为结束挂起的异步读取         
                    int nBytesRec = sock.EndReceive(ar);
                    //如果有接收到数据的话            
                    if (nBytesRec > 0)
                    {
                        //声明一个字符串,用来存储解析过的字符串                
                        string m_strLine = "";
                        //遍历Socket接收到的字符                 
                        /*       
                         * 此循环用来调整linux 和 windows在换行上标记的区别       
                         * 最后将调整好的字符赋予给 m_strLine      
                         */
                        for (int i = 0; i < nBytesRec; i++)
                        {
                            Char ch = Convert.ToChar(m_byBuff[i]);
                            switch (ch)
                            {
                                case '
    ':
                                    m_strLine += Convert.ToString("
    ");
                                    break;
                                case '
    ':
                                    break;
                                default:
                                    m_strLine += Convert.ToString(ch);
                                    break;
                            }
                        }
                        try
                        {
                            //获得转义后的字符串的长度                  
                            int strLinelen = m_strLine.Length;
                            //如果长度为零                   
                            if (strLinelen == 0)
                            {
                                //则返回"
    " 即回车换行                    
                                m_strLine = Convert.ToString("
    ");
                            }
                            //建立一个流,把接收的信息(转换后的)存进 mToProcess 中   
                            Byte[] mToProcess = new Byte[strLinelen];
                            for (int i = 0; i < strLinelen; i++)
                                mToProcess[i] = Convert.ToByte(m_strLine[i]);
                            //对接收的信息进行处理,包括对传输过来的信息的参数的存取和       
                            string mOutText = ProcessOptions(mToProcess);
                            //==== 夏春涛 扩充 20110531 ==============================================
                            mOutText = ConvertToGB2312(mOutText);
                            strWorkingDataX = mOutText;
                            //===================================================================
                            //解析命令后返回 显示信息(即除掉了控制信息)                        
                            if (mOutText != "")
                            {
                                //Console.Write(mOutText);//显示输出//夏春涛 去掉 20110531/////////////////////////
                                strWorkingData = mOutText;
                                strFullLog += mOutText;
                            }
                            //接收完数据,处理完字符串数据等一系列事物之后,开始回发数据          
                            RespondToOptions();
                        }
                        catch (Exception ex)
                        {
                            throw new Exception("接收数据的时候出错了! " + ex.Message);
                        }
                    }
                    else// 如果没有接收到任何数据的话           
                    {
                        // 关闭连接            
                        // 关闭socket               
                        sock.Shutdown(SocketShutdown.Both);
                        sock.Close();
                    }
                }
                catch { }
            }
            /// <summary>        
            ///  发送数据的函数       
            /// </summary>        
            private void RespondToOptions()
            {
                try
                {
                    //声明一个字符串,来存储 接收到的参数            
                    string strOption;
                    /*               
                     * 此处的控制信息参数,是之前接受到信息之后保存的              
                     * 例如 255   253   23   等等                                
                     */
                    for (int i = 0; i < m_ListOptions.Count; i++)
                    {
                        //获得一个控制信息参数                   
                        strOption = (string)m_ListOptions[i];
                        //根据这个参数,进行处理                   
                        ArrangeReply(strOption);
                    }
                    DispatchMessage(m_strResp);
                    m_strResp = "";
                    m_ListOptions.Clear();
                }
                catch (Exception ers)
                {
                    Console.WriteLine("出错了,在回发数据的时候 " + ers.Message);
    
                }
            }
            /// <summary>        
            /// 解析接收的数据,生成最终用户看到的有效文字,同时将附带的参数存储起来       
            ///</summary>       
            ///<param name="m_strLineToProcess">收到的处理后的数据</param>     
            /// <returns></returns>     
            private string ProcessOptions(byte[] m_strLineToProcess)
            {
                string m_DISPLAYTEXT = "";
                string m_strTemp = "";
                string m_strOption = "";
                string m_strNormalText = "";
                bool bScanDone = false;
                int ndx = 0;
                int ldx = 0;
                char ch;
                try
                {
                    //把数据从byte[] 转化成string    
                    for (int i = 0; i < m_strLineToProcess.Length; i++)
                    {
                        Char ss = Convert.ToChar(m_strLineToProcess[i]);
                        m_strTemp = m_strTemp + Convert.ToString(ss);
                    }
    
                    //此处意义为,当没描完数据前,执行扫描      
                    while (bScanDone != true)
                    {
                        //获得长度                
                        int lensmk = m_strTemp.Length;
                        //之后开始分析指令,因为每条指令为255 开头,故可以用此来区分出每条指令 
                        ndx = m_strTemp.IndexOf(Convert.ToString(IAC));
                        //此处为出错判断,本无其他含义               
                        if (ndx > lensmk)
                            ndx = m_strTemp.Length;
    
                        //此处为,如果搜寻到IAC标记的telnet 指令,则执行以下步骤        
                        if (ndx != -1)
                        {
                            #region 如果存在IAC标志位
                            // 将 标志位IAC 的字符 赋值给最终显示文字           
                            m_DISPLAYTEXT += m_strTemp.Substring(0, ndx);
                            // 此处获得命令码              
                            ch = m_strTemp[ndx + 1];
                            //如果命令码是253(DO) 254(DONT)  521(WILL) 252(WONT) 的情况下 
                            if (ch == DO || ch == DONT || ch == WILL || ch == WONT)
                            {
    
                                //将以IAC 开头3个字符组成的整个命令存储起来          
                                m_strOption = m_strTemp.Substring(ndx, 3);
                                m_ListOptions.Add(m_strOption);
                                // 将 标志位IAC 的字符 赋值给最终显示文字                         
                                m_DISPLAYTEXT += m_strTemp.Substring(0, ndx);
                                //将处理过的字符串删去                          
                                string txt = m_strTemp.Substring(ndx + 3);
                                m_strTemp = txt;
                            }
                            //如果IAC后面又跟了个IAC (255)  
                            else if (ch == IAC)
                            {
                                //则显示从输入的字符串头开始,到之前的IAC 结束        
                                m_DISPLAYTEXT = m_strTemp.Substring(0, ndx);
                                //之后将处理过的字符串排除出去                  
                                m_strTemp = m_strTemp.Substring(ndx + 1);
                            }
                            //如果IAC后面跟的是SB(250)       
                            else if (ch == SB)
                            {
                                m_DISPLAYTEXT = m_strTemp.Substring(0, ndx);
                                ldx = m_strTemp.IndexOf(Convert.ToString(SE));
                                m_strOption = m_strTemp.Substring(ndx, ldx);
                                m_ListOptions.Add(m_strOption);
                                m_strTemp = m_strTemp.Substring(ldx);
                            }
                            #endregion
                        }
                        //若字符串里已经没有IAC标志位了  
                        else
                        {
    
                            //显示信息累加上m_strTemp存储的字段      
                            m_DISPLAYTEXT = m_DISPLAYTEXT + m_strTemp;
                            bScanDone = true;
                        }
                    }
                    //输出人看到的信息    
                    m_strNormalText = m_DISPLAYTEXT;
                }
                catch (Exception eP)
                {
                    throw new Exception("解析传入的字符串错误:" + eP.Message);
                }
    
                return m_strNormalText;
            }
            /// <summary>      
            /// 获得IP地址      
            /// </summary>       
            /// <param name="import"></param>    
            /// <returns></returns>   
            private static IPAddress GetIP(string import)
            {
                IPHostEntry IPHost = Dns.GetHostEntry(import);
                return IPHost.AddressList[0];
            }
    
            #region magic Function
            //解析传过来的参数,生成回发的数据到m_strResp   
            private void ArrangeReply(string strOption)
            {
                try
                {
                    Char Verb;
                    Char Option;
                    Char Modifier;
                    Char ch;
                    bool bDefined = false;
                    //排错选项,无啥意义              
                    if (strOption.Length < 3) return;
                    //获得命令码               
                    Verb = strOption[1];
                    //获得选项码             
                    Option = strOption[2];
                    //如果选项码为 回显(1) 或者是抑制继续进行(3)
                    if (Option == 1 || Option == 3)
                    {
                        bDefined = true;
                    }
                    // 设置回发消息,首先为标志位255         
                    m_strResp += IAC;
                    //如果选项码为 回显(1) 或者是抑制继续进行(3) ==true   
                    if (bDefined == true)
                    {
                        #region 继续判断
                        //如果命令码为253 (DO)             
                        if (Verb == DO)
                        {
                            //我设置我应答的命令码为 251(WILL) 即为支持 回显或抑制继续进行     
                            ch = WILL;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        //如果命令码为 254(DONT)     
                        if (Verb == DONT)
                        {
                            //我设置我应答的命令码为 252(WONT) 即为我也会"拒绝启动" 回显或抑制继续进行
                            ch = WONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        //如果命令码为251(WILL)   
                        if (Verb == WILL)
                        {
                            //我设置我应答的命令码为 253(DO) 即为我认可你使用回显或抑制继续进行 
                            ch = DO;
                            m_strResp += ch;
                            m_strResp += Option;
                            //break;               
                        }
                        //如果接受到的命令码为251(WONT)         
                        if (Verb == WONT)
                        {
                            //应答  我也拒绝选项请求回显或抑制继续进行       
                            ch = DONT;
                            m_strResp += ch;
                            m_strResp += Option;
                            //break;            
                        }
                        //如果接受到250(sb,标志子选项开始)            
                        if (Verb == SB)
                        {
                            /*                  
                             * 因为启动了子标志位,命令长度扩展到了4字节,                    
                             * 取最后一个标志字节为选项码                     
                             * 如果这个选项码字节为1(send)                    
                             * 则回发为 250(SB子选项开始) + 获取的第二个字节 + 0(is) + 255(标志位IAC) + 240(SE子选项结束)               
                             */
                            Modifier = strOption[3];
                            if (Modifier == SEND)
                            {
                                ch = SB;
                                m_strResp += ch;
                                m_strResp += Option;
                                m_strResp += IS;
                                m_strResp += IAC;
                                m_strResp += SE;
                            }
                        }
                        #endregion
                    }
                    else //如果选项码不是1 或者3 
                    {
                        #region 底下一系列代表,无论你发那种请求,我都不干
                        if (Verb == DO)
                        {
                            ch = WONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        if (Verb == DONT)
                        {
                            ch = WONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        if (Verb == WILL)
                        {
                            ch = DONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        if (Verb == WONT)
                        {
                            ch = DONT;
                            m_strResp += ch;
                            m_strResp += Option;
                        }
                        #endregion
                    }
                }
                catch (Exception eeeee)
                {
                    throw new Exception("解析参数时出错:" + eeeee.Message);
                }
            }
            /// <summary>     
            /// 将信息转化成charp[] 流的形式,使用socket 进行发出   
            /// 发出结束之后,使用一个匿名委托,进行接收,  
            /// 之后这个委托里,又有个委托,意思是接受完了之后执行OnRecieveData 方法 
            ///       
            /// </summary>       
            /// <param name="strText"></param>  
            void DispatchMessage(string strText)
            {
                try
                {
                    //申请一个与字符串相当长度的char流      
                    Byte[] smk = new Byte[strText.Length];
                    for (int i = 0; i < strText.Length; i++)
                    {
                        //解析字符串,将其存储到char流中去   
                        Byte ss = Convert.ToByte(strText[i]);
                        smk[i] = ss;
                    }
                    //发送char流,之后发送完毕后执行委托中的方法(此处为匿名委托)    
                    IAsyncResult ar2 = s.BeginSend(smk, 0, smk.Length, SocketFlags.None, delegate(IAsyncResult ar)
                    {
                        //当执行完"发送数据" 这个动作后                  
                        // 获取Socket对象,对象从beginsend 中的最后个参数上获得          
                        Socket sock1 = (Socket)ar.AsyncState;
                        if (sock1.Connected)//如果连接还是有效                    
                        {
                            //这里建立一个委托      
                            AsyncCallback recieveData = new AsyncCallback(OnRecievedData);
    
                            sock1.BeginReceive(m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData, sock1);
    
                        }
                    }, s);
    
                    s.EndSend(ar2);
                }
                catch (Exception ers)
                {
                    Console.WriteLine("出错了,在回发数据的时候:" + ers.Message);
                }
            }
    
            /// <summary>
            /// 等待指定的字符串返回
            /// </summary>
            /// <param name="DataToWaitFor">等待的字符串</param>
            /// <returns>返回0</returns>
            public int WaitFor(string DataToWaitFor)
            {
                long lngStart = DateTime.Now.AddSeconds(this.timeout).Ticks;
                long lngCurTime = 0;
    
                while (strWorkingData.ToLower().IndexOf(DataToWaitFor.ToLower()) == -1)
                {
                    lngCurTime = DateTime.Now.Ticks;
                    if (lngCurTime > lngStart)
                    {
                        throw new Exception("Timed Out waiting for : " + DataToWaitFor);
                    }
                    Thread.Sleep(1);
                }
                strWorkingData = "";
                return 0;
            }
    
            public void Send(string message)
            {
                DispatchMessage(message);
                //因为每发送一行都没有发送回车,故在此处补上         
                DispatchMessage("
    ");
            }
            #endregion
    
            /// <summary>
            /// 取完整日志
            /// </summary>
            public string SessionLog
            {
                get
                {
                    return strFullLog;
                }
            }
    
            //======================================================================================
            /// <summary>
            /// 字符串编码转换,解决汉字显示乱码问题。
    
            /// 原始字符串中的汉字存储的是汉字内码,此代码实质是将汉字内码转换为GB2312编码。(夏春涛20110531)
            /// </summary>
            /// <param name="str_origin">需要转换的字符串</param>
            /// <returns>转换后的字符串</returns>
            private string ConvertToGB2312(string str_origin)
            {
                char[] chars = str_origin.ToCharArray();
                byte[] bytes = new byte[chars.Length];
                for (int i = 0; i < chars.Length; i++)
                {
                    int c = (int)chars[i];
                    bytes[i] = (byte)c;
                }
                Encoding Encoding_GB2312 = Encoding.GetEncoding("GB2312");
                string str_converted = Encoding_GB2312.GetString(bytes);
                return str_converted;
            }
            //======================================================================================
        }
    }

    三:Ctelnet.cs类

    using System;
    using System.Text;
    using System.Net.Sockets;
    using FineUI;
    
    /// <summary>
    /// Summary description for ClassTelnet
    /// </summary>
    public class ClassTelnet
    {
        TcpClient telnet_tcp_client;
    
        public string strhost;      // IP 地址
        public string strusername;  // username
        public string strpassword;  // password
        private int ilogin_wait_time = 200; //网络延迟等待时间
        private int irecv_wait_time = 100; //网络延迟等待时间
    
        //Telnet protocal key
        enum Verbs
        {
            WILL = 251,
            WONT = 252,
            DO = 253,
            DONT = 254,
            IAC = 255
        }
        public ClassTelnet()
        {
        }
        /**
         * Telnet 关闭连接
         */
        public void close_telnet()
        {
            try
            {
                if (telnet_tcp_client == null)
                {
                    return;
                }
                if (telnet_tcp_client.Connected)
                {
                    telnet_tcp_client.Close();
                }
            }
            catch (Exception ex)
            {
                //Consule.Write("异常");
                Alert.Show("异常");
            }
        }
    
        /**
         * Telnet连接到服务器
         */
        public bool open_connect()
        {
            bool blresult;
            string strtemp;
    
            blresult = true;
    
            try
            {
                // new socket
                telnet_tcp_client = new TcpClient(this.strhost, 23);
    
                System.Threading.Thread.Sleep(ilogin_wait_time);
                // read host info data
                strtemp = recv_data_from_host();
                //strtemp = ConvertToGB2312(strtemp);
                blresult = strtemp.TrimEnd().EndsWith(":");
                if (blresult == false)
                {
                    Alert.Show("read host info data error");
                    return blresult;
                }
    
                // username send to host
                blresult = send_data_to_host(this.strusername + "/n/r");
                if (blresult == false)
                {
                    Alert.Show("username send error");
                    return blresult;
                }
    
                System.Threading.Thread.Sleep(ilogin_wait_time);
                strtemp = recv_data_from_host();
                blresult = strtemp.TrimEnd().EndsWith(":");
                if (blresult == false)
                {
                    return blresult;
                }
    
                // password send to host
                blresult = send_data_to_host(this.strpassword + "/n/r");
                if (blresult == false)
                {
                    return blresult;
                }
                System.Threading.Thread.Sleep(ilogin_wait_time);
                strtemp = recv_data_from_host();
                if ((strtemp.Trim().LastIndexOf("#") > -1) ||
                    (strtemp.Trim().LastIndexOf("$") > -1) ||
                    (strtemp.Trim().LastIndexOf(">") > -1))
                {
                    blresult = true;
                }
                else
                {
                    blresult = false;
                }
            }
            catch (Exception ex)
            {
                blresult = false;
            }
            return blresult;
        }
    
        /**
         * 执行命令
         */
        public bool exec_command(string strcmd)
        {
            bool blresult;
            string strprompt;
    
            blresult = false;
            strprompt = "";
    
            if (telnet_tcp_client.Connected)
            {
                blresult = send_data_to_host(strcmd + "/n/r");
                if (blresult == false)
                {
                    return false;
                }
                strprompt = "";
    
                strprompt = recv_data_from_host();
    
                if ((strprompt.Trim().LastIndexOf("#") > -1) ||
                    (strprompt.Trim().LastIndexOf("$") > -1) ||
                    (strprompt.Trim().LastIndexOf(">") > -1))
                {
                    blresult = true;
                    return blresult;
                }
            }
            return blresult;
        }
    
        /**
         * telnet向主机发送数据
         */
        public bool send_data_to_host(string strcmd)
        {
            try
            {
                // socket error时、return
                if (!telnet_tcp_client.Connected)
                {
                    return false;
                }
    
                byte[] bbuf = System.Text.ASCIIEncoding.ASCII.GetBytes(strcmd.Replace("/0xFF", "/0xFF/0xFF"));
    
                telnet_tcp_client.GetStream().Write(bbuf, 0, bbuf.Length);
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }
    
        /**
         * Telnet从主机接受数据
         */
        public string recv_data_from_host()
        {
            int iinput_data;    //data
            int inputverb;
            int inputoption;
            StringBuilder sbtemp;
            NetworkStream ns_temp;
            byte[] bread_buffer;
            StringBuilder sbcomplete_message;
            int iread_bytes_num;
    
            sbtemp = new StringBuilder();
    
            // socket没有连接的时候,返回空
            if (!telnet_tcp_client.Connected)
            {
                return null;
            }
    
            do
            {
                // read 1 byte
                iinput_data = telnet_tcp_client.GetStream().ReadByte();
                switch (iinput_data)
                {
                    case -1:
                        break;
                    case (int)Verbs.IAC: // 接受的数据有keyword
    
                        // read 1 byte
                        inputverb = telnet_tcp_client.GetStream().ReadByte();
                        if (inputverb == -1) break;
                        switch (inputverb)
                        {
                            case (int)Verbs.IAC:
                                sbtemp.Append(inputverb);
                                break;
                            case (int)Verbs.DO:
                            case (int)Verbs.DONT:
                            case (int)Verbs.WILL:
                            case (int)Verbs.WONT:
                                inputoption = telnet_tcp_client.GetStream().ReadByte();
                                if (inputoption == -1) break;
                                telnet_tcp_client.GetStream().WriteByte((byte)Verbs.IAC);
                                telnet_tcp_client.GetStream().WriteByte(inputverb ==
                                (int)Verbs.DO ? (byte)Verbs.WONT : (byte)Verbs.DONT);
                                telnet_tcp_client.GetStream().WriteByte((byte)inputoption);
                                break;
                            default:
                                break;
                        }
                        break;
                    default:
                        sbtemp.Append((char)iinput_data);
                        bread_buffer = new byte[8192];
                        sbcomplete_message = new StringBuilder();
                        iread_bytes_num = 0;
                        ns_temp = telnet_tcp_client.GetStream();
                        if (ns_temp.CanRead)
                        {
                            System.Threading.Thread.Sleep(ilogin_wait_time);
                            iread_bytes_num = ns_temp.Read(bread_buffer, 0, bread_buffer.Length);
                            sbtemp.AppendFormat("{0}", Encoding.ASCII.GetString(bread_buffer,
                                                0, iread_bytes_num));
                        }
                        break;
                }
    
                // timeout
                System.Threading.Thread.Sleep(irecv_wait_time);
            } while (telnet_tcp_client.Available > 0);
    
            // 返回接受的数据
            return sbtemp.ToString();
        }
    
        /**
         * 例子程序
         */
        public bool exec_sample()
        {
            bool blsts;
            blsts = true;
    
            // 关闭Telnet连接
            this.close_telnet();
    
            // telnet连接到远程主机
            blsts = this.open_connect();
            if (blsts == false)
            {
                return blsts;
            }
    
            // 在远程主机上执行命令
            blsts = this.exec_command("echo ABC");
            // 执行失败
            if (blsts == false)
            {
                Alert.Show("命令执行失败");
            }
            return blsts;
        }
        //======================================================================================
        /// <summary>
        /// 字符串编码转换,解决汉字显示乱码问题。
    
        /// 原始字符串中的汉字存储的是汉字内码,此代码实质是将汉字内码转换为GB2312编码。(夏春涛20110531)
        /// </summary>
        /// <param name="str_origin">需要转换的字符串</param>
        /// <returns>转换后的字符串</returns>
        private string ConvertToGB2312(string str_origin)
        {
            char[] chars = str_origin.ToCharArray();
            byte[] bytes = new byte[chars.Length];
            for (int i = 0; i < chars.Length; i++)
            {
                int c = (int)chars[i];
                bytes[i] = (byte)c;
            }
            Encoding Encoding_GB2312 = Encoding.GetEncoding("GB2312");
            string str_converted = Encoding_GB2312.GetString(bytes);
            return str_converted;
        }
        //======================================================================================
       
    }
  • 相关阅读:
    详述Xgboost原理
    Uncaught Error: Script error for "popper.js", needed by: bootstrap
    JS 正则表达式从地址中提取省市县
    OneThink实现多图片批量上传功能
    移动端图片上传解决方案localResizeIMG先压缩后ajax无刷新上传
    PHPCMS V9添加模板自定义全局变量
    CentOS 7:如何安装防火墙?
    HTML5的fieldset标签
    PHP使用CURL详解
    asp.net+swfupload 多图片批量上传(附源码下载)
  • 原文地址:https://www.cnblogs.com/mq0036/p/4329402.html
Copyright © 2020-2023  润新知