Vamos a analizar como conectar nuesto programa en C# a un host en Telnet.

El programa se conectará usando un Usuario y Contraseña al puerto 23 (Telnet) y efectuerá un comando telnet de prueba.

Para este ejemplo usamos el TcpClient y la AsyncCallback para evitar que la ejecucion del programa se pare si no encuentra la direción IP prestablesida y se quede sin responder.

Para empezar vamos a Abrir una conexion TCP

using System.Net;
using System.Net.Sockets;
using System.IO;
NetworkString ns = null;

void InitConnection()
{

try
{

  // Notifica que se ha producido un evento a un subproceso en espera.
  AutoResetEvent connectDone = new AutoResetEvent(false);

  // Proporciona conexiones de cliente para servicios de red TCP.
  TcpClient tcpClient = new TcpClient();

//Comienza una solicitud asincrónica para una conexión a host remoto.
  tcpClient.BeginConnect(IPADDRESS, PORT, new AsyncCallback( delegate(IAsyncResult ar) {
   tcpClient.EndConnect(ar); connectDone.Set();}), tcpClient);

// si tarda mas del TIMEOUT entonces termina la connexion y para  el proceso
 if (!connectDone.WaitOne(TIMEOUT))
 {
    MessageBox.Show("Network connection failed!");
    return;
 }

  ns = tcpClient.GetStream();
  connectHostandReboot(USER, PASSWORD);
  tcpClient.Close();

}
catch (Exception e)
{
   MessageBox.Show(e.ToString());
}

}

Con esto abrimos una conexion TCP al host Telnet y nos aseguramos que si pasa el tiempo de timeout el programa no se pare.

Una vez hecha la conexion podemos hacer el login y executar comandos:

public void connectHostandReboot(string user, string passwd)
{

// Conectando.....
  Byte[] output = new Byte[1024];
  String responseoutput = String.Empty;
  Byte[] cmd = System.Text.Encoding.ASCII.GetBytes("\n");
  ns.Write(cmd, 0, cmd.Length);

  Thread.Sleep(1000);
  Int32 bytes = ns.Read(output, 0, output.Length);
  responseoutput = System.Text.Encoding.ASCII.GetString(output, 0, bytes);
  // para comprobar que estamos conectados podemos controlar si el servidor nos devuelve una respuesta con la palabra login
  Regex objToMatch = new Regex("login:");
  if (objToMatch.IsMatch(responseoutput))
  {
    cmd = System.Text.Encoding.ASCII.GetBytes(user + "\r");
    ns.Write(cmd, 0, cmd.Length);
  }
  else
  {
    MessageBox.Show("Host Not Connected");
    return;
  }

  Thread.Sleep(1000);
  bytes = ns.Read(output, 0, output.Length);
  responseoutput = System.Text.Encoding.ASCII.GetString(output, 0, bytes);

  objToMatch = new Regex("Password");
  if (objToMatch.IsMatch(responseoutput))
  {
    cmd = System.Text.Encoding.ASCII.GetBytes(passwd + "\r");
    ns.Write(cmd, 0, cmd.Length);
  }
  else
  {
    lstView.Items.Add(IPADDRESS + " User not valid");
    return;
  }

  Thread.Sleep(1000);
  bytes = ns.Read(output, 0, output.Length);
  responseoutput = System.Text.Encoding.ASCII.GetString(output, 0, bytes);

  // controlamos el nombre de usuario que sea root
  objToMatch = new Regex("root");
  if (objToMatch.IsMatch(responseoutput))
  {

   // aqui podemos mandar el comando telnet que quieremos executar en el servidor.
   cmd = System.Text.Encoding.ASCII.GetBytes("comando telenet" + "\r");
   ns.Write(cmd, 0, cmd.Length);
  }
  else
  {
    lstView.Items.Add(IPADDRESS + " Contraseña no valida");
    return;
  }

  Thread.Sleep(1000);
  responseoutput = System.Text.Encoding.ASCII.GetString(output, 0, bytes);
}

Las variables que se usan son las siguentes:

const string IPADDRESS = "";
const int PORT = 23;
const int TIMEOUT = 2000;
const string USER = "";
const string PASSWORD = "";