using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.IO;
using System.Threading ;namespace TELNETCLIENT
{
/// <summary>
/// Summary description for Form1.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
Char IAC = Convert.ToChar(255);
Char DO = Convert.ToChar(253);
Char DONT = Convert.ToChar(254);
Char WILL = Convert.ToChar(251);
Char WONT = Convert.ToChar(252);
Char SB = Convert.ToChar(250);
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';
string m_strResp; private ArrayList  m_ListOptions = new ArrayList();
private IPEndPoint iep ;
private AsyncCallback callbackProc ;
private string address ;
private int port ;
private Socket s ;
Byte[] m_byBuff = new Byte[32767];
private System.Windows.Forms.RichTextBox textBox1;

[STAThread]
static void Main() 
{
try
{
Application.Run(new Form1());
}
catch(Exception eeeee )
{
MessageBox.Show(eeeee.Message , "Application Error!!!" , MessageBoxButtons.OK , MessageBoxIcon.Stop );
Application.Exit();
}
} private void Form1_Load(object sender, System.EventArgs e)
{
////////////////////////////////////////////////////////////////
textBox1.SelectionLength= 0;
Login login_dlg = new Login() ;
if ( login_dlg.ShowDialog() == DialogResult.Cancel)
Application.Exit() ; address = login_dlg.SERVER.Text;
port = int.Parse(login_dlg.PORT.Text); IPHostEntry IPHost = Dns.Resolve(address); 
string []aliases = IPHost.Aliases; 
IPAddress[] addr = IPHost.AddressList; 

try
{
// Create New Socket 
s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// Create New EndPoint
iep = new IPEndPoint(addr[0],port);  
// This is a non blocking IO
s.Blocking = false ;
// Assign Callback function to read from Asyncronous Socket
callbackProc = new AsyncCallback(ConnectCallback);
// Begin Asyncronous Connection
s.BeginConnect(iep , callbackProc, s ) ;

}
catch(Exception eeeee )
{
MessageBox.Show(eeeee.Message , "Application Error!!!" , MessageBoxButtons.OK , MessageBoxIcon.Stop );
Application.Exit();
}
} public void ConnectCallback( IAsyncResult ar )
{
try
{
// Get The connection socket from the callback
Socket sock1 = (Socket)ar.AsyncState;
if ( sock1.Connected ) 
{
// Define a new Callback to read the data 
AsyncCallback recieveData = new AsyncCallback( OnRecievedData );
// Begin reading data asyncronously
sock1.BeginReceive( m_byBuff, 0, m_byBuff.Length, SocketFlags.None, recieveData , sock1 );
}
}
catch( Exception ex )
{
MessageBox.Show( this, ex.Message, "Setup Recieve callbackProc failed!" );
}
}
public void OnRecievedData( IAsyncResult ar )
{
// Get The connection socket from the callback
Socket sock = (Socket)ar.AsyncState;
// Get The data , if any
int nBytesRec = sock.EndReceive( ar );
if( nBytesRec > 0 )
{
string sRecieved = Encoding.ASCII.GetString( m_byBuff, 0, nBytesRec );
string m_strLine="";
for ( int i=0; i < nBytesRec;i++)
{
Char ch = Convert.ToChar(m_byBuff[i]);
switch( ch )
{
case '\r': 
m_strLine += Convert.ToString("\r\n"); 
break;
case '\n': 
break;
default: 
m_strLine += Convert.ToString(ch);
break;

}
try
{
int strLinelen = m_strLine.Length ;
if ( strLinelen == 0 ) 
{
m_strLine = Convert.ToString("\r\n");
} 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);
if ( mOutText != "" ) 
textBox1.AppendText(mOutText);

// Respond to any incoming commands
RespondToOptions();
}
catch( Exception ex )
{
Object x = this ;
MessageBox.Show(ex.Message , "Information!" );
}
}
else
{
// If no data was recieved then the connection is probably dead
Console.WriteLine( "Disconnected", sock.RemoteEndPoint );
sock.Shutdown( SocketShutdown.Both );
sock.Close();
Application.Exit();
}
}

解决方案 »

  1.   

    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
    {
    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;
    ndx = m_strTemp.IndexOf(Convert.ToString(IAC));
    if ( ndx > lensmk )
    ndx = m_strTemp.Length; if(ndx != -1)
    {
    m_DISPLAYTEXT+= m_strTemp.Substring(0,ndx);
    ch = m_strTemp[ndx + 1];
    if ( ch == DO || ch == DONT || ch == WILL || ch == WONT ) 
    {
    m_strOption = m_strTemp.Substring(ndx, 3);
    string txt = m_strTemp.Substring(ndx + 3);
    m_DISPLAYTEXT+= m_strTemp.Substring(0,ndx);
    m_ListOptions.Add(m_strOption);
    m_strTemp = txt ;
    }
    else
    if ( ch == IAC)
    {
    m_DISPLAYTEXT= m_strTemp.Substring(0,ndx);
    m_strTemp = m_strTemp.Substring(ndx + 1);
    }
    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);
    }
    }
    else
    {
    m_DISPLAYTEXT = m_DISPLAYTEXT + m_strTemp;
    bScanDone = true ;
    }

    m_strNormalText = m_DISPLAYTEXT; 
    }
    catch(Exception eP)
    {
    MessageBox.Show(eP.Message , "Application Error!!!" , MessageBoxButtons.OK , MessageBoxIcon.Stop );
    Application.Exit();
    }
    return m_strNormalText ;
    }

    void DispatchMessage(string strText)
    {
    try
    {
    Byte[] smk = new Byte[strText.Length];
    for ( int i=0; i < strText.Length ; i++)
    {
    Byte ss = Convert.ToByte(strText[i]);
    smk[i] = ss ;
    } IAsyncResult ar2 = s.BeginSend(smk , 0 , smk.Length , SocketFlags.None , callbackProc , s );
    s.EndSend(ar2);
    }
    catch(Exception ers)
    {
    MessageBox.Show("ERROR IN RESPOND OPTIONS");
    }
    } void RespondToOptions()
    {
    try
    {
    string strOption;
    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)
    {
    MessageBox.Show("ERROR IN RESPOND OPTIONS");
    }
    }
    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]; if ( Option == 1 || Option == 3 ) 
    {
    // case 1: // Echo
    // case 3: // Suppress Go-Ahead
    bDefined = true;
    // break;
    } m_strResp += IAC; if(bDefined == true )
    {
    if ( Verb == DO ) 
    {
    // case DO:
    ch = WILL;
    m_strResp += ch;
    m_strResp += Option;
    // break;
    }
    if ( Verb == DONT ) 
    {
    ch = WONT;
    m_strResp += ch;
    m_strResp += Option;
    // break;
    }
    if ( Verb == WILL ) 
    {
    ch = DO;
    m_strResp += ch;
    m_strResp += Option;
    //break;
    }
    if ( Verb == WONT)
    {
    ch = DONT;
    m_strResp += ch;
    m_strResp += Option;
    // break;
    }
    if ( Verb == SB)
    {
    Modifier = strOption[3];
    if(Modifier == SEND)
    {
    ch = SB;
    m_strResp += ch;
    m_strResp += Option;
    m_strResp += IS;
    m_strResp += IAC;
    m_strResp += SE;
    }
    // break;
    }
    }
    else
    {
    // switch(Verb)
    // {
    if ( Verb == DO ) 
    {
    ch = WONT;
    m_strResp += ch;
    m_strResp += Option;
    // break;
    }
    if ( Verb == DONT)
    {
    ch = WONT;
    m_strResp += ch;
    m_strResp += Option;
    // break;
    }
    if ( Verb == WILL)
    {
    ch = DONT;
    m_strResp += ch;
    m_strResp += Option;
    // break;
    }
    if ( Verb == WONT)
    {
    ch = DONT;
    m_strResp += ch;
    m_strResp += Option;
    // break;
    }
    }
    }
    catch(Exception eeeee )
    {
    MessageBox.Show(eeeee.Message , "Application Error!!!" , MessageBoxButtons.OK , MessageBoxIcon.Stop );
    Application.Exit();
    } } private void textBox1_KeyPress_1(object sender, System.Windows.Forms.KeyPressEventArgs e)
    {
    if ( e.KeyChar == 13 ) 
    {
    DispatchMessage("\r\n");
    }
    else
    if ( e.KeyChar == 8 )
    {
    try
    {
    // string mtmp = textBox1.Text.Substring(0,textBox1.Text.Length-1);
    // textBox1.Text = "" ;  
    }
    catch(Exception ebs)
    {
    MessageBox.Show("ERROR IN BACKSPACE");
    }
    }
    else
    {
    string str = e.KeyChar.ToString();
    DispatchMessage(str);
    }
    }
    }
    }