Telnet соединение с использованием .net - PullRequest
4 голосов
/ 25 мая 2010

Наш офис в настоящее время использует telnet для запроса внешнего сервера. Процедура примерно такая.

  1. Соединение - телнет открыт 128 ........ 25000
  2. Запрос - мы вставляем запрос и затем нажимаем alt + 019
  3. Ответ - Мы получаем ответ в виде текста в окне telnet

Так что я пытаюсь сделать эти запросы автоматически, используя приложение c #. Мой код следующий

Сначала соединение. (Без исключений)

    SocketClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    String szIPSelected = txtIPAddress.Text;
    String szPort = txtPort.Text;
    int alPort = System.Convert.ToInt16(szPort, 10);

    System.Net.IPAddress remoteIPAddress = System.Net.IPAddress.Parse(szIPSelected);
    System.Net.IPEndPoint remoteEndPoint = new System.Net.IPEndPoint(remoteIPAddress, alPort);
    SocketClient.Connect(remoteEndPoint);

Затем я отправляю запрос (без исключений)

    string data ="some query";
    byte[] byData = System.Text.Encoding.ASCII.GetBytes(data);
    SocketClient.Send(byData);

Тогда я пытаюсь получить ответ

    byte[] buffer = new byte[10];
    Receive(SocketClient, buffer, 0, buffer.Length, 10000);
    string str = Encoding.ASCII.GetString(buffer, 0, buffer.Length);
    txtDataRx.Text = str;

public static void Receive(Socket socket, byte[] buffer, int offset, int size, int timeout)
{
  int startTickCount = Environment.TickCount;
  int received = 0;  // how many bytes is already received
  do
  {
    if (Environment.TickCount > startTickCount + timeout)
      throw new Exception("Timeout.");
    try
    {
      received += socket.Receive(buffer, offset + received, size - received, SocketFlags.None);
    }
    catch (SocketException ex)
    {
      if (ex.SocketErrorCode == SocketError.WouldBlock ||
          ex.SocketErrorCode == SocketError.IOPending ||
          ex.SocketErrorCode == SocketError.NoBufferSpaceAvailable)
      {
        // socket buffer is probably empty, wait and try again
        Thread.Sleep(30);
      }
      else
        throw ex;  // any serious error occurr
    }
  } while (received < size);
}

Каждый раз, когда я пытаюсь получить ответ, я получаю «существующее соединение принудительно закрыто удаленным хостом», если открыть telnet и отправить тот же запрос, я сразу получаю ответ

Есть идеи или предложения?

Ответы [ 3 ]

5 голосов
/ 26 мая 2010

Исходя из обмена комментариями между вами и мной, может показаться, что вам нужно добавить код 19 Ascii (0x13) в конец вашего запроса.

2 голосов
/ 25 мая 2010

Вообще говоря, проблемы такого рода легко решаются с помощью инструмента сетевого анализа (сниффер), такого как Wireshark .

Более конкретно, протокол telnet включает в себя этап согласования в начале сеанса. Я предполагаю, что если вы проигнорируете это, хозяин будет недоволен. Использование Wireshark при успешном соединении через telnet покажет вам, что вам не хватает.

1 голос
/ 11 июня 2010

Вот пример библиотеки telnet вместе с программой, которая использует ее для входа в маршрутизатор Cisco и загрузки конфигурации IOS.

http://www.xpresslearn.com/networking/code/csharp-telnet-client

...