MainForm.cs
上传用户:wangzj
上传日期:2016-05-05
资源大小:29k
文件大小:29k
源码类别:

Telnet客户端

开发平台:

C#

  1. using System;
  2. using System.Drawing;
  3. using System.Collections;
  4. using System.ComponentModel;
  5. using System.Windows.Forms;
  6. using System.Data;
  7. using System.IO;
  8. using System.Net.Sockets;
  9. using System.Net;
  10. using System.Threading;
  11. namespace TelnetClient
  12. {
  13. /// <summary>
  14. /// Form1 的摘要说明。
  15. /// </summary>
  16. public class MainForm : System.Windows.Forms.Form
  17. {
  18. //---------------------------------常量定义
  19. const char GO_NORM = (char)0;
  20. const char SUSP = (char)237;
  21. const char ABORT = (char)238; 
  22. const char SE = (char)240; //子选项结束Subnegotiation End
  23. const char NOP = (char)241;
  24. const char DM = (char)242; //Data Mark
  25. const char BREAK = (char)243; //BREAK
  26. const char IP = (char)244; //Interrupt Process
  27. const char AO = (char)245; //Abort Output
  28. const char AYT = (char)246; //Are you there
  29. const char EC = (char)247; //Erase character
  30. const char EL = (char)248; //Erase Line
  31. const char GOAHEAD = (char)249; //Go Ahead
  32. const char SB = (char)250; //子选项开始Subnegotiation Begin
  33. const char WILL = (char)251;
  34. const char WONT = (char)252;
  35. const char DO = (char)253;
  36. const char DONT = (char)254;
  37. const char IAC = (char)255;
  38. const char BINARY = (char)0;
  39. const char IS = (char)0;
  40. const char SEND = (char)1;
  41. const char ECHO = (char)1;
  42. const char RECONNECT = (char)2;
  43. const char SGA = (char)3;
  44. const char AMSN = (char)4;
  45. const char STATUS = (char)5;
  46. const char TIMING = (char)6;
  47. const char RCTAN = (char)7;
  48. const char OLW = (char)8;
  49. const char OPS = (char)9;
  50. const char OCRD = (char)10;
  51. const char OHTS = (char)11;
  52. const char OHTD = (char)12;
  53. const char OFFD = (char)13;
  54. const char OVTS = (char)14;
  55. const char OVTD = (char)15;
  56. const char OLFD = (char)16;
  57. const char XASCII = (char)17;
  58. const char LOGOUT = (char)18;
  59. const char BYTEM = (char)19;
  60. const char DET = (char)20;
  61. const char SUPDUP = (char)21;
  62. const char SUPDUPOUT = (char)22;
  63. const char SENDLOC = (char)23;
  64. const char TERMTYPE = (char)24;
  65. const char EOR = (char)25;
  66. const char TACACSUID = (char)26;
  67. const char OUTPUTMARK = (char)27;
  68. const char TERMLOCNUM = (char)28;
  69. const char REGIME3270 = (char)29;
  70. const char X3PAD = (char)30;
  71. const char NAWS = (char)31;
  72. const char TERMSPEED = (char)32;
  73. const char TFLOWCNTRL = (char)33;
  74. const char LINEMODE = (char)34;
  75. const char DISPLOC = (char)35;
  76. const char ENVIRON = (char)36;
  77. const char AUTHENTICATION = (char)37;
  78. const char UNKNOWN39 = (char)39;
  79. const char EXTENDED_OPTIONS_LIST = (char)255;
  80. const char RANDOM_LOSE = (char)256;
  81. const char CR = (char)13; //回车
  82. const char LF = (char)10; //换行
  83. const string BACK =  "[P";
  84. private short[] parsedata;
  85. protected bool sw_ugoahead;
  86. protected bool sw_igoahead;
  87. protected bool sw_echo;
  88. protected bool sw_termsent;
  89. private SettingsForm sf;
  90. private Socket socket;
  91. public System.Windows.Forms.Timer cursor_timer;
  92. public System.Windows.Forms.ToolTip ToolTip1;
  93. public System.Windows.Forms.MainMenu MainMenu1;
  94. public System.Windows.Forms.MenuItem mFile;
  95. public System.Windows.Forms.MenuItem mConnection;
  96. public System.Windows.Forms.MenuItem mSettings;
  97. private System.Windows.Forms.MenuItem menuItem3;
  98. private System.Windows.Forms.MenuItem menuItemOpen;
  99. private System.Windows.Forms.MenuItem menuItemClose;
  100. public System.Windows.Forms.MenuItem miExit;
  101. private System.Windows.Forms.StatusBar statusBar1;
  102. private System.Windows.Forms.StatusBarPanel statusBarPanel1;
  103. private System.Windows.Forms.StatusBarPanel statusBarPanel2;
  104. private System.Windows.Forms.StatusBarPanel statusBarPanel3;
  105. private System.Windows.Forms.StatusBarPanel statusBarPanel4;
  106. private System.Windows.Forms.RichTextBox rtbConsole;
  107. private System.ComponentModel.IContainer components;
  108. public MainForm()
  109. {
  110. //
  111. // Windows 窗体设计器支持所必需的
  112. //
  113. InitializeComponent();
  114. //
  115. // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
  116. //
  117. parsedata = new short[10];
  118. sf = new SettingsForm();
  119. string ip = GetLocalAPAddress();
  120. if (ip != "")
  121. {
  122. this.statusBarPanel2.Text = "本地IP地址:" + ip;
  123. }
  124. else
  125. {
  126. this.statusBarPanel2.Text = "无法获得本机IP地址,请检查网络连接";
  127. this.mFile.Enabled = false;
  128. }
  129. }
  130. /// <summary>
  131. /// 清理所有正在使用的资源。
  132. /// </summary>
  133. protected override void Dispose( bool disposing )
  134. {
  135. if( disposing )
  136. {
  137. if (components != null) 
  138. {
  139. components.Dispose();
  140. }
  141. }
  142. base.Dispose( disposing );
  143. }
  144. #region Windows 窗体设计器生成的代码
  145. /// <summary>
  146. /// 设计器支持所需的方法 - 不要使用代码编辑器修改
  147. /// 此方法的内容。
  148. /// </summary>
  149. private void InitializeComponent()
  150. {
  151. this.components = new System.ComponentModel.Container();
  152. this.cursor_timer = new System.Windows.Forms.Timer(this.components);
  153. this.ToolTip1 = new System.Windows.Forms.ToolTip(this.components);
  154. this.MainMenu1 = new System.Windows.Forms.MainMenu();
  155. this.mFile = new System.Windows.Forms.MenuItem();
  156. this.menuItemOpen = new System.Windows.Forms.MenuItem();
  157. this.menuItemClose = new System.Windows.Forms.MenuItem();
  158. this.menuItem3 = new System.Windows.Forms.MenuItem();
  159. this.miExit = new System.Windows.Forms.MenuItem();
  160. this.mConnection = new System.Windows.Forms.MenuItem();
  161. this.mSettings = new System.Windows.Forms.MenuItem();
  162. this.statusBar1 = new System.Windows.Forms.StatusBar();
  163. this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel();
  164. this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel();
  165. this.statusBarPanel3 = new System.Windows.Forms.StatusBarPanel();
  166. this.statusBarPanel4 = new System.Windows.Forms.StatusBarPanel();
  167. this.rtbConsole = new System.Windows.Forms.RichTextBox();
  168. ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit();
  169. ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).BeginInit();
  170. ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel3)).BeginInit();
  171. ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel4)).BeginInit();
  172. this.SuspendLayout();
  173. // 
  174. // cursor_timer
  175. // 
  176. this.cursor_timer.Interval = 300;
  177. // 
  178. // MainMenu1
  179. // 
  180. this.MainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  181.   this.mFile,
  182.   this.mConnection});
  183. // 
  184. // mFile
  185. // 
  186. this.mFile.Index = 0;
  187. this.mFile.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  188.   this.menuItemOpen,
  189.   this.menuItemClose,
  190.   this.menuItem3,
  191.   this.miExit});
  192. this.mFile.Text = "文件(&F)";
  193. // 
  194. // menuItemOpen
  195. // 
  196. this.menuItemOpen.Index = 0;
  197. this.menuItemOpen.Text = "打开连接(&O)";
  198. this.menuItemOpen.Click += new System.EventHandler(this.menuItemOpen_Click);
  199. // 
  200. // menuItemClose
  201. // 
  202. this.menuItemClose.Index = 1;
  203. this.menuItemClose.Text = "关闭连接(&C)";
  204. this.menuItemClose.Click += new System.EventHandler(this.menuItemClose_Click);
  205. // 
  206. // menuItem3
  207. // 
  208. this.menuItem3.Index = 2;
  209. this.menuItem3.Text = "-";
  210. // 
  211. // miExit
  212. // 
  213. this.miExit.Index = 3;
  214. this.miExit.Text = "退出(&X)";
  215. this.miExit.Click += new System.EventHandler(this.miExit_Click);
  216. // 
  217. // mConnection
  218. // 
  219. this.mConnection.Index = 1;
  220. this.mConnection.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
  221. this.mSettings});
  222. this.mConnection.Text = "设置(&S)";
  223. // 
  224. // mSettings
  225. // 
  226. this.mSettings.Index = 0;
  227. this.mSettings.Text = "连接设置(&S)";
  228. this.mSettings.Click += new System.EventHandler(this.mSettings_Click);
  229. // 
  230. // statusBar1
  231. // 
  232. this.statusBar1.Location = new System.Drawing.Point(0, 503);
  233. this.statusBar1.Name = "statusBar1";
  234. this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] {
  235.   this.statusBarPanel1,
  236.   this.statusBarPanel2,
  237.   this.statusBarPanel3,
  238.   this.statusBarPanel4});
  239. this.statusBar1.ShowPanels = true;
  240. this.statusBar1.Size = new System.Drawing.Size(728, 22);
  241. this.statusBar1.TabIndex = 0;
  242. // 
  243. // statusBarPanel1
  244. // 
  245. this.statusBarPanel1.Text = "状态:";
  246. this.statusBarPanel1.Width = 120;
  247. // 
  248. // statusBarPanel2
  249. // 
  250. this.statusBarPanel2.Text = "本地地址:";
  251. this.statusBarPanel2.Width = 200;
  252. // 
  253. // statusBarPanel3
  254. // 
  255. this.statusBarPanel3.Text = "服务器地址:";
  256. this.statusBarPanel3.Width = 200;
  257. // 
  258. // statusBarPanel4
  259. // 
  260. this.statusBarPanel4.AutoSize = System.Windows.Forms.StatusBarPanelAutoSize.Spring;
  261. this.statusBarPanel4.Text = "服务器状态:";
  262. this.statusBarPanel4.Width = 192;
  263. // 
  264. // rtbConsole
  265. // 
  266. this.rtbConsole.BackColor = System.Drawing.Color.Black;
  267. this.rtbConsole.BorderStyle = System.Windows.Forms.BorderStyle.None;
  268. this.rtbConsole.Dock = System.Windows.Forms.DockStyle.Fill;
  269. this.rtbConsole.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  270. this.rtbConsole.ForeColor = System.Drawing.Color.White;
  271. this.rtbConsole.Location = new System.Drawing.Point(0, 0);
  272. this.rtbConsole.Name = "rtbConsole";
  273. this.rtbConsole.ReadOnly = true;
  274. this.rtbConsole.Size = new System.Drawing.Size(728, 503);
  275. this.rtbConsole.TabIndex = 1;
  276. this.rtbConsole.Text = "";
  277. this.rtbConsole.KeyDown += new System.Windows.Forms.KeyEventHandler(this.rtbConsole_KeyDown);
  278. this.rtbConsole.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.rtbConsole_KeyPress);
  279. // 
  280. // MainForm
  281. // 
  282. this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
  283. this.BackColor = System.Drawing.SystemColors.ActiveBorder;
  284. this.ClientSize = new System.Drawing.Size(728, 525);
  285. this.Controls.Add(this.rtbConsole);
  286. this.Controls.Add(this.statusBar1);
  287. this.Menu = this.MainMenu1;
  288. this.Name = "MainForm";
  289. this.Text = "Telnet客户端";
  290. this.Closing += new System.ComponentModel.CancelEventHandler(this.MainForm_Closing);
  291. this.Load += new System.EventHandler(this.MainForm_Load);
  292. ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit();
  293. ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).EndInit();
  294. ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel3)).EndInit();
  295. ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel4)).EndInit();
  296. this.ResumeLayout(false);
  297. }
  298. #endregion
  299. /// <summary>
  300. /// 应用程序的主入口点。
  301. /// </summary>
  302. [STAThread]
  303. static void Main() 
  304. {
  305. Application.Run(new MainForm());
  306. }
  307. private void MainForm_Load(object sender, System.EventArgs e)
  308. {
  309. loadSettings();
  310. }
  311. private void mSettings_Click(object sender, System.EventArgs e)
  312. {
  313. sf.lblEffect.BackColor = this.rtbConsole.BackColor;
  314. sf.lblEffect.ForeColor = this.rtbConsole.ForeColor;
  315. sf.lblEffect.Font = this.rtbConsole.Font; 
  316. if (sf.ShowDialog()== DialogResult.OK)
  317. {
  318. this.rtbConsole.ForeColor = sf.lblEffect.ForeColor;
  319. this.rtbConsole.BackColor = sf.lblEffect.BackColor;
  320. this.rtbConsole.Font = sf.lblEffect.Font;
  321. this.rtbConsole.SelectionFont = sf.lblEffect.Font;
  322. }
  323. }
  324. private void miExit_Click(object sender, System.EventArgs e)
  325. {
  326. this.Close();
  327. }
  328. private void menuItemOpen_Click(object sender, System.EventArgs e)
  329. {
  330. Connect();
  331. }
  332. private void menuItemClose_Click(object sender, System.EventArgs e)
  333. {
  334. CloseConnection();
  335. }
  336. //装载程序参数设置
  337. private void loadSettings()
  338. {
  339. string path = System.Windows.Forms.Application.ExecutablePath 
  340. + ".settings.set";
  341. if (File.Exists(path))  
  342. {
  343. using (StreamReader sr = File.OpenText(path)) 
  344. {
  345. try 
  346. {
  347. sf.txtRemoteAddress.Text = sr.ReadLine();
  348. sf.txtPort.Text = sr.ReadLine();
  349. sf.chkAutoConnect.Checked = 
  350. System.Convert.ToBoolean(sr.ReadLine());
  351. sf.lblEffect.BackColor = 
  352. Color.FromArgb(System.Convert.ToInt32(sr.ReadLine()));
  353. sf.lblEffect.ForeColor = 
  354. Color.FromArgb(System.Convert.ToInt32(sr.ReadLine()));
  355. string fontFamily = sr.ReadLine();
  356. float size = System.Convert.ToSingle(sr.ReadLine());
  357. string style = sr.ReadLine();
  358. FontStyle fs = 0;
  359. if (style.IndexOf("Bold")>-1)
  360. {
  361. fs |= FontStyle.Bold;
  362. }
  363. if (style.IndexOf("Italic")>-1)
  364. {
  365. fs |= FontStyle.Italic;
  366. }
  367. if (style.IndexOf("Regular")>-1)
  368. {
  369. fs |= FontStyle.Regular;
  370. }
  371. if (style.IndexOf("Strikeout")>-1)
  372. {
  373. fs |= FontStyle.Strikeout;
  374. }
  375. if (style.IndexOf("Underline")>-1)
  376. {
  377. fs |= FontStyle.Underline;
  378. }
  379. GraphicsUnit gu = 0;
  380. string s = sr.ReadLine();
  381. if (s.IndexOf("Display")>-1)
  382. {
  383. gu |= GraphicsUnit.Display;
  384. }
  385. if (s.IndexOf("Document")>-1)
  386. {
  387. gu |= GraphicsUnit.Document;
  388. }
  389. if (s.IndexOf("Inch")>-1)
  390. {
  391. gu |= GraphicsUnit.Inch;
  392. }
  393. if (s.IndexOf("Millimeter")>-1)
  394. {
  395. gu |= GraphicsUnit.Millimeter;
  396. }
  397. if (s.IndexOf("Pixel")>-1)
  398. {
  399. gu |= GraphicsUnit.Pixel;
  400. }
  401. if (s.IndexOf("Point")>-1)
  402. {
  403. gu |= GraphicsUnit.Point;
  404. }
  405. if (s.IndexOf("World")>-1)
  406. {
  407. gu |= GraphicsUnit.World;
  408. }
  409.  
  410. Font font = new Font(fontFamily, size, fs,gu,
  411. System.Convert.ToByte(sr.ReadLine()),
  412. System.Convert.ToBoolean(sr.ReadLine()));
  413. sf.lblEffect.Font = font;
  414. this.rtbConsole.ForeColor = sf.lblEffect.ForeColor;
  415. this.rtbConsole.BackColor = sf.lblEffect.BackColor;
  416. this.rtbConsole.Font = sf.lblEffect.Font;
  417. this.rtbConsole.SelectionFont = sf.lblEffect.Font;
  418. //自动连接
  419. if (sf.chkAutoConnect.Checked)
  420. {
  421. this.Connect();
  422. }
  423. }
  424. catch (Exception e)
  425. {
  426. Console.WriteLine(e.ToString());
  427. }
  428. }
  429. }
  430. }
  431. private void rtbConsole_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
  432. {
  433. if (socket == null || !socket.Connected)
  434. {
  435. return;
  436. }
  437. bool control_on = e.Control;
  438. string key = "";
  439. switch (e.KeyCode)
  440. {
  441. case Keys.Back:
  442. Send((char)e.KeyCode+"");
  443. break;
  444. case Keys.End:
  445. key = OUTPUTMARK + "[K";
  446. break;
  447. case Keys.Home:
  448. key = OUTPUTMARK + "[H";
  449. break;
  450. case Keys.Left:
  451. key  = OUTPUTMARK + "[D";
  452. break;
  453. case Keys.Right:
  454. key  = OUTPUTMARK + "[C";
  455. break;
  456. case Keys.Up:
  457. key =  OUTPUTMARK + "[A";
  458. break;
  459. case Keys.Down:
  460. key = OUTPUTMARK + "[B";
  461. break;
  462. case Keys.F1:
  463. key  = OUTPUTMARK + "OP";
  464. break;
  465. case Keys.F2:
  466. key = OUTPUTMARK + "OQ";
  467. break;
  468. case Keys.F3:
  469. key  = OUTPUTMARK + "OR";
  470. break;
  471. case Keys.F4:
  472. key = OUTPUTMARK + "OS";
  473. break;
  474. default:
  475. if (control_on && e.KeyValue > 63)
  476. {
  477. key = "" + (char)(e.KeyValue - 64);
  478. }
  479. break;
  480. }
  481. if (key.Length >0)
  482. {
  483. Send(key);
  484. }
  485. e.Handled = true;
  486. }
  487. private void rtbConsole_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
  488. {
  489. if (socket == null || !socket.Connected)
  490. {
  491. return;
  492. }
  493. if (e.KeyChar == 13)
  494. {
  495. Send(e.KeyChar.ToString() + LF);
  496. }
  497. else
  498. {
  499. //只接受有效的字符
  500. if (e.KeyChar >= ' ' && e.KeyChar <= 'z')
  501. {
  502. Send(e.KeyChar.ToString());
  503. }
  504. }
  505. e.Handled = true;
  506. }
  507. private void Connect() 
  508. {
  509. sw_igoahead = false;
  510. sw_ugoahead = true;
  511. sw_igoahead = false;
  512. sw_echo = true;
  513. sw_termsent = false;
  514. Console.WriteLine("连接服务器" + sf.txtRemoteAddress.Text + "...");
  515. socket = new Socket(AddressFamily.InterNetwork,
  516. SocketType.Stream,ProtocolType.Tcp);
  517. socket.SetSocketOption (SocketOptionLevel.Socket, 
  518. SocketOptionName.SendTimeout, 5000);
  519. IPAddress ipAdd=IPAddress.Parse(sf.txtRemoteAddress.Text);
  520. int port = System.Convert.ToInt32(sf.txtPort.Text);
  521. IPEndPoint hostEndPoint = new IPEndPoint(ipAdd, port);
  522. try
  523. {
  524. socket.Connect(hostEndPoint);
  525. }
  526. catch (Exception e)
  527. {
  528. Console.WriteLine(e.ToString());
  529. this.statusBarPanel4.Text = "服务器状态:服务器未准备好";
  530. return;
  531. }
  532. if (socket.Connected)
  533. {
  534. //更新状态
  535. this.statusBarPanel1.Text = "状态:已连接";
  536. this.statusBarPanel3.Text = "服务器地址:" + 
  537. sf.txtRemoteAddress.Text;
  538. this.statusBarPanel4.Text = "服务器状态:服务器已经接受连接"; 
  539. Thread thread=new Thread(new ThreadStart(this.TelnetThread));
  540. thread.Start();
  541. }
  542. }
  543. private void CloseConnection()
  544. {
  545. if (socket != null && socket.Connected)
  546. {
  547. socket.Shutdown(SocketShutdown.Both);
  548. socket.Close();
  549. }
  550. this.statusBarPanel1.Text = "状态:断开连接...";
  551. }
  552. private string GetLocalAPAddress()
  553. {
  554. IPAddress[] AddressList = Dns.GetHostByName(Dns.GetHostName()).AddressList;
  555. if (AddressList.Length>0)
  556. {
  557. //首先获得拨号动态分配IP地址
  558. //如果没有,则获得局域网地址
  559. return AddressList[AddressList.Length-1].ToString();
  560. }
  561. return "";
  562. }
  563. private void TelnetThread()
  564. {
  565. while(socket.Connected)
  566. {
  567. try
  568. {
  569. string str = Receive();
  570. str = str.Replace("", "");
  571. string delim = "b";
  572. str = str.Trim(delim.ToCharArray());
  573. if (str.Length > 0)
  574. {
  575. Console.WriteLine(str);
  576. if (str == OUTPUTMARK + BACK)
  577. {
  578. //BackupSpace键处理
  579. this.rtbConsole.ReadOnly = false;
  580. int curpos = rtbConsole.SelectionStart;
  581. this.rtbConsole.Select(curpos-1, 1);
  582. this.rtbConsole.SelectedText = "";
  583. this.rtbConsole.ReadOnly = true;
  584. }
  585. else 
  586. {
  587. int len;
  588. for (int i=0;i<str.Length;i+=80)
  589. {
  590. len = 80;
  591. if (i+80 > str.Length)
  592. {
  593. len = str.Length -i;
  594. }
  595. this.rtbConsole.AppendText(str.Substring(i, len));
  596. }
  597. }
  598. }
  599. Thread.Sleep(100);
  600. }
  601. catch (Exception e)
  602. {
  603. Console.WriteLine(e.ToString());
  604. }
  605. }
  606. this.statusBarPanel1.Text = "状态:已断开";
  607. }
  608. private void MainForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
  609. {
  610. CloseConnection();
  611. }
  612. //向Telnet服务器发送命令
  613. private void Send(string msg)
  614. {
  615. System.Byte[] message=System.Text.Encoding.ASCII.GetBytes(
  616. msg.ToCharArray());
  617. socket.Send(message,message.Length,0);
  618. }
  619. //向Telnet服务器发送命令
  620. private void Send(char[] chr)
  621. {
  622. System.Byte[] message=System.Text.Encoding.ASCII.GetBytes(chr);
  623. socket.Send(message,message.Length,0);
  624. }
  625. //接收数据
  626. private string Receive()
  627. {
  628. //用于接收数据的缓冲
  629. byte[] buf;
  630. string result="";
  631. int count = socket.Available;
  632. if (count > 0)
  633. {
  634. buf = new byte[count];
  635. socket.Receive(buf);
  636. result = ProcessOptions(buf);
  637. }
  638. return result;
  639. }
  640. //处理命令字符,buf是包含数据的缓冲
  641. private string ProcessOptions(byte[] buf)
  642. {
  643. string strNormal="";
  644. int i=0;
  645. while(i<buf.Length)
  646. {
  647. if (buf[i]==IAC)
  648. {
  649. switch((char)buf[++i])
  650. {
  651. case DO:
  652. Console.Write("--------------接收到 DO ");
  653. ProcessDo(buf[++i]);
  654. break;
  655. case DONT:
  656. Console.Write("--------------接收到 DONT ");
  657. ProcessDont(buf[++i]);
  658. break;
  659. case WONT:
  660. Console.Write("--------------接收到 WONT ");
  661. ProcessWont(buf[++i]);
  662. break;
  663. case WILL:
  664. Console.Write("--------------接收到 WILL ");
  665. ProcessWill(buf[++i]);
  666. break;
  667. case IAC:
  668. //正常字符
  669. strNormal += System.Text.Encoding.Default.GetString(buf,i,1);
  670. break;
  671. case SB:
  672. //子会话开始
  673. int j=0;
  674. while(buf[++i] != SE)
  675. {
  676. parsedata[j++] = buf[i];
  677. }
  678. //子会话结束:
  679. switch((char)parsedata[0])
  680. {
  681. case TERMTYPE:
  682. break;
  683. case TERMSPEED:
  684. if (parsedata[1] == 1)
  685. {
  686. Console.WriteLine("发送: SB TERMSPEED 57600,57600");
  687. Send(IAC +
  688. SB + TERMSPEED + 
  689. IS + "57600,57600" + IAC + SE);
  690. }
  691. break;
  692. }
  693. break;
  694. default:
  695. Console.WriteLine("无效的命令" + buf[1]);
  696. i++;
  697. break;
  698. };
  699. }
  700. else
  701. {
  702. //正常的文字
  703. strNormal += System.Text.Encoding.Default.GetString(buf,i,1);
  704. }
  705. i++;
  706. }
  707. return strNormal;
  708. }
  709. private void ProcessDo(short ch)
  710. {
  711. //处理DO,以WILL或者WONT响应
  712. switch((char)ch)
  713. {
  714. case BINARY:
  715. Console.WriteLine(BINARY);
  716. Send(new char[] {IAC, WONT, BINARY});
  717. Console.WriteLine("发送: WONT BINARY");
  718. break;
  719. case ECHO:
  720. Console.WriteLine(ECHO);
  721. Send(new char[] {IAC, WONT, ECHO});
  722. Console.WriteLine("发送: WONT ECHO");
  723. break;
  724. case SGA:
  725. Console.WriteLine(SGA);
  726. if (!sw_igoahead)
  727. {
  728. Send(new char[] {IAC, WILL, SGA});
  729. Console.WriteLine("发送: WILL SGA");
  730. sw_igoahead = true;
  731. }
  732. else
  733. {
  734. Console.WriteLine("不发送响应");
  735. }
  736. break;
  737. case TERMSPEED:
  738. Console.WriteLine(TERMSPEED);
  739. Send(new char[] {IAC, WILL, TERMSPEED});
  740. Console.WriteLine("发送: WILL TERMSPEED");
  741. Send(IAC + SB + TERMSPEED + (char)0 + "57600,57600" + 
  742.   IAC + SE);
  743. Console.WriteLine("发送:SB TERMSPEED 57600");
  744. break;
  745. case TFLOWCNTRL:
  746. Console.WriteLine(TFLOWCNTRL);
  747. Send(new char[] {IAC, WONT, TFLOWCNTRL});
  748. Console.WriteLine("发送: WONT TFLOWCNTRL");
  749. break;
  750. case LINEMODE:
  751. Console.WriteLine(LINEMODE);
  752. Send(new char[] {IAC, WONT, LINEMODE});
  753. Console.WriteLine("发送: WONT LINEMODE");
  754. break;
  755. case STATUS:
  756. Console.WriteLine(STATUS);
  757. Send(new char[] {IAC, WONT, STATUS});
  758. Console.WriteLine("发送: WONT STATUS");
  759. break;
  760. case TIMING:
  761. Console.WriteLine(TIMING);
  762. Send(new char[] {IAC, WONT, TIMING});
  763. Console.WriteLine("发送: WONT TIMING");
  764. break;
  765. case DISPLOC:
  766. Console.WriteLine(DISPLOC);
  767. Send(new char[] {IAC, WONT, DISPLOC});
  768. Console.WriteLine("发送: WONT DISPLOC");
  769. break;
  770. case ENVIRON:
  771. Console.WriteLine(ENVIRON);
  772. Send(new char[] {IAC, WONT, ENVIRON});
  773. Console.WriteLine("发送: WONT ENVIRON");
  774. break;
  775. case UNKNOWN39:
  776. Console.WriteLine(UNKNOWN39);
  777. Send(new char[] {IAC, WILL, UNKNOWN39});
  778. Console.WriteLine("发送: WILL UNKNOWN39");
  779. break;
  780. case AUTHENTICATION:
  781. Console.WriteLine(AUTHENTICATION);
  782. Send(new char[] {IAC, WONT, AUTHENTICATION});
  783. Console.WriteLine("发送: WONT AUTHENTICATION");
  784. Console.WriteLine("发送: SB AUTHENTICATION");
  785. Send(IAC + SB + AUTHENTICATION + (char)0 + (char)0 +
  786. (char)0 + (char)0 + "" + IAC + SE);
  787. break;
  788. default:
  789. Console.WriteLine("未知的选项");
  790. break;
  791. }
  792. }
  793. //处理DONT
  794. private void ProcessDont(short ch)
  795. {
  796. switch((char)ch)
  797. {
  798. case SE:
  799. Console.WriteLine(SE);
  800. Console.WriteLine("接收到: RECEIVED SE");
  801. break;
  802. case ECHO:
  803. Console.WriteLine(ECHO);
  804. if (!sw_echo)
  805. {
  806. sw_echo = true;
  807. Send(new char[] {IAC, WONT, ECHO});
  808. Console.WriteLine("发送: WONT ECHO");
  809. }
  810. break;
  811. case SGA:
  812. Console.WriteLine(SGA);
  813. if (!sw_ugoahead)
  814. {
  815. Send(new char[] {IAC, WONT, SGA});
  816. Console.WriteLine("发送: WONT SGA");
  817. sw_ugoahead = true;
  818. }
  819. break;
  820. case TERMSPEED:
  821. Console.WriteLine(TERMSPEED);
  822. Send(new char[] {IAC, WONT, TERMSPEED});
  823. Console.WriteLine("发送: WONT TERMSPEED");
  824. break;
  825. case TFLOWCNTRL:
  826. Console.WriteLine(TFLOWCNTRL);
  827. Send(new char[] {IAC, WONT, TFLOWCNTRL});
  828. Console.WriteLine("发送: WONT TFLOWCNTRL");
  829. break;
  830. case STATUS:
  831. Console.WriteLine(STATUS);
  832. Send(new char[] {IAC, WONT, STATUS});
  833. Console.WriteLine("发送: WONT STATUS");
  834. break;
  835. case TIMING:
  836. Console.WriteLine(TIMING);
  837. Send(new char[] {IAC, WONT, TIMING});
  838. Console.WriteLine("发送: WONT TIMING");
  839. break;
  840. case DISPLOC:
  841. Console.WriteLine(DISPLOC);
  842. Send(new char[] {IAC, WONT, DISPLOC});
  843. Console.WriteLine("发送: WONT DISPLOC");
  844. break;
  845. case ENVIRON:
  846. Console.WriteLine(ENVIRON);
  847. Send(new char[] {IAC, WONT, ENVIRON});
  848. Console.WriteLine("发送: WONT ENVIRON");
  849. break;
  850. case UNKNOWN39:
  851. Console.WriteLine(UNKNOWN39);
  852. Send(new char[] {IAC, WILL, UNKNOWN39});
  853. Console.WriteLine("发送: WILL UNKNOWN39");
  854. break;
  855. default:
  856. break;
  857. }
  858. }
  859. //处理WONT
  860. private void ProcessWont(short ch)
  861. {
  862. switch((char)ch)
  863. {
  864. case ECHO:
  865. Console.WriteLine(ECHO);
  866. if (sw_echo)
  867. {
  868. sw_echo = false;
  869. Send(new char[] {IAC, DONT, ECHO});
  870. Console.WriteLine("发送: DONT ECHO");
  871. }
  872. break;
  873. case SGA:
  874. Console.WriteLine(SGA);
  875. Send(new char[] {IAC, DONT, SGA});
  876. Console.WriteLine("发送: DONT SGA");
  877. sw_igoahead = false;
  878. break;
  879. case TERMSPEED:
  880. Console.WriteLine(TERMSPEED);
  881. Send(new char[] {IAC, DONT, TERMSPEED});
  882. Console.WriteLine("发送: DONT TERMSPEED");
  883. break;
  884. case TFLOWCNTRL:
  885. Console.WriteLine(TFLOWCNTRL);
  886. Send(new char[] {IAC, DONT, TFLOWCNTRL});
  887. Console.WriteLine("发送: DONT TFLOWCNTRL");
  888. break;
  889. case LINEMODE:
  890. Console.WriteLine(LINEMODE);
  891. Send(new char[] {IAC, DONT, LINEMODE});
  892. Console.WriteLine("发送: DONT LINEMODE");
  893. break;
  894. case STATUS:
  895. Console.WriteLine(STATUS);
  896. Send(new char[] {IAC, DONT, STATUS});
  897. Console.WriteLine("发送: DONT STATUS");
  898. break;
  899. case TIMING:
  900. Console.WriteLine(TIMING);
  901. Send(new char[] {IAC, WONT, TIMING});
  902. Console.WriteLine("发送: WONT TIMING");
  903. break;
  904. case DISPLOC:
  905. Console.WriteLine(DISPLOC);
  906. Send(new char[] {IAC, DONT, DISPLOC});
  907. Console.WriteLine("发送: DONT DISPLOC");
  908. break;
  909. case ENVIRON:
  910. Console.WriteLine(ENVIRON);
  911. Send(new char[] {IAC, DONT, ENVIRON});
  912. Console.WriteLine("发送: DONT ENVIRON");
  913. break;
  914. case UNKNOWN39:
  915. Console.WriteLine(UNKNOWN39);
  916. Send(new char[] {IAC, DONT, UNKNOWN39});
  917. Console.WriteLine("发送: DONT UNKNOWN39");
  918. break;
  919. default:
  920. Console.WriteLine("未知的选项");
  921. break;
  922. }
  923. }
  924. //处理WILL,以DO或者DONT响应
  925. private void ProcessWill(short ch)
  926. {
  927. switch((char)ch)
  928. {
  929. case ECHO:
  930. Console.WriteLine(ECHO);
  931. if (!sw_echo)
  932. {
  933. sw_echo = true;
  934. Send(new char[] {IAC, DO, ECHO});
  935. Console.WriteLine("发送: DO ECHO");
  936. }
  937. break;
  938. case SGA:
  939. Console.WriteLine(SGA);
  940. if (!sw_ugoahead)
  941. {
  942. Send(new char[] {IAC, DO, SGA});
  943. Console.WriteLine("发送: DO SGA");
  944. sw_ugoahead = true;
  945. }
  946. else
  947. {
  948. Console.WriteLine("不发送响应");
  949. }
  950. break;
  951. case TERMTYPE:
  952. Console.WriteLine("TERMTYPE");
  953. if (!sw_termsent)
  954. {
  955. Send(new char[] {IAC, WILL, TERMTYPE});
  956. Send(IAC + SB + TERMTYPE + (char)0 + "VT100" + IAC + SE);
  957. sw_termsent = true;
  958. Console.WriteLine("发送: SB TERMTYPE VT100");
  959. }
  960. break;
  961. case TERMSPEED:
  962. Console.WriteLine(TERMSPEED);
  963. Send(new char[] {IAC, DONT, TERMSPEED});
  964. Console.WriteLine("发送: DONT TERMSPEED");
  965. break;
  966. case TFLOWCNTRL:
  967. Console.WriteLine(TFLOWCNTRL);
  968. Send(new char[] {IAC, DONT, TFLOWCNTRL});
  969. Console.WriteLine("发送: DONT TFLOWCNTRL");
  970. break;
  971. case LINEMODE:
  972. Console.WriteLine(LINEMODE);
  973. Send(new char[] {IAC, WONT, LINEMODE});
  974. Console.WriteLine("发送: WONT LINEMODE");
  975. break;
  976. case STATUS:
  977. Console.WriteLine(STATUS);
  978. Send(new char[] {IAC, DONT, STATUS});
  979. Console.WriteLine("发送: DONT STATUS");
  980. break;
  981. case TIMING:
  982. Console.WriteLine(TIMING);
  983. Send(new char[] {IAC, DONT, TIMING});
  984. Console.WriteLine("发送: DONT TIMING");
  985. break;
  986. case DISPLOC:
  987. Console.WriteLine(DISPLOC);
  988. Send(new char[] {IAC, DONT, DISPLOC});
  989. Console.WriteLine("发送: DONT DISPLOC");
  990. break;
  991. case ENVIRON:
  992. Console.WriteLine(ENVIRON);
  993. Send(new char[] {IAC, DONT, ENVIRON});
  994. Console.WriteLine("发送: DONT ENVIRON");
  995. break;
  996. case UNKNOWN39:
  997. Console.WriteLine(UNKNOWN39);
  998. Send(new char[] {IAC, DONT, UNKNOWN39});
  999. Console.WriteLine("发送: DONT UNKNOWN39");
  1000. break;
  1001. default:
  1002. Console.WriteLine("未知的选项");
  1003. break;
  1004. }
  1005. }
  1006. }
  1007. }