C#使用TcpClient实现telnet功能
2011-11-24 23:55
330 查看
// minimalistic telnet implementation // conceived by Tom Janssens on 2007/06/06 for codeproject // // http://www.corebvba.be using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; namespace testTelnet { enum Verbs { WILL = 251, WONT = 252, DO = 253, DONT = 254, IAC = 255 } enum Options { SGA = 3 } class TelnetConnection { TcpClient tcpSocket; int TimeOutMs = 1*1000; public TelnetConnection(String Hostname, int Port) { tcpSocket = new TcpClient(Hostname, Port); } public string Login(string Username, string Password, int LoginTimeOutMs) { int oldTimeOutMs = TimeOutMs; TimeOutMs = LoginTimeOutMs; string s = Read(); if (!s.TrimEnd().EndsWith(":")) throw new Exception("Failed to connect : no login prompt"); WriteLine(Username); s += Read(); if (!s.TrimEnd().EndsWith(":")) throw new Exception("Failed to connect : no password prompt"); WriteLine(Password); s += Read(); TimeOutMs = oldTimeOutMs; return s; } public void DisConnect() { if (tcpSocket != null) { if (tcpSocket.Connected) { tcpSocket.Client.Disconnect(true); } } } public void WriteLine(string cmd) { Write(cmd + "\r\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 ConvertToGB2312(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; } } } 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; } } }
启动代码
static void Main(string[] args) { //create a new telnet connection to hostname "gobelijn" on port "23" TelnetConnection tc = new TelnetConnection("127.0.0.1", 23); //login with user "root",password "rootpassword", using a timeout of 100ms, //and show server output string s = tc.Login("administrator", "pw", 100); Console.Write(s); // server output should end with "{1}quot; or ">", otherwise the connection failed string prompt = s.TrimEnd(); prompt = s.Substring(prompt.Length - 1, 1); if (prompt != ":") throw new Exception("Connection failed"); prompt = ""; // while connected while (tc.IsConnected && prompt.Trim() != "exit") { // display server output Console.Write(tc.Read()); // send client input to server prompt = Console.ReadLine(); tc.WriteLine(prompt); // display server output Console.Write(tc.Read()); } Console.WriteLine("***DISCONNECTED"); Console.ReadLine(); }
相关文章推荐
- C#使用TcpClient实现telnet功能
- C# 使用WebRequest 实现FTP常用功能
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
- 如何使用C#自带的GDI+双缓冲类BufferedGraphics实现双缓冲功能
- C#实现SMTP服务器,使用TCP命令实现,功能比较完善
- C#中使用PrintDialog方便的实现程序的打印功能
- Winform(C#.NET)自动更新组件的使用及部分功能实现(续)
- C#程序中使用DataView的ToTable方法实现distinct功能
- Winform(C#.NET)自动更新组件的使用及部分功能实现(一点改进功能)
- 在C#中使用PrintDialog可以很方便的实现程序的打印功能。
- 在C#中实现打印功能(C#中PrintDialog,PrintDocument的使用)实用的类
- 【C#】使用TcpListener和TcpClient实现简单通信
- C#开发微信门户及应用(39)--使用微信JSSDK实现签到的功能
- 在C#中实现打印功能(C#中PrintDialog,PrintDocument的使用) (转)
- 在C#中实现打印功能(C#中PrintDialog,PrintDocument的使用)
- C#实现SMTP服务器,使用TCP命令实现,功能比较完善
- Winform(C#.NET)自动更新组件的使用及部分功能实现
- 在 C# 中实现打印功能(C# 中 PrintDialog,PrintDocument 的使用)
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
- C实现分割字符串(使用strtok_s函数,完成C#的Split函数功能)