Задать вопрос
spark108
@spark108

Как подключится к Telnet из C#?

Пытаюсь подключится к Telnet серверу по средствам следующего кода:

Сразу скажу, что код не дописан. Меня волнует сейчас лишь работа метода ReadTelnet и TCPClient.

using System;
using System.Diagnostics;
using System.Xml.Linq;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;

namespace Spark108.Asda
{
	class ReloadApp
	{
		private static void Main(string[] args)
		{
			new ReloadApp(args);
		}
		
		public ReloadApp(string[] args)
		{
			Console.Title = "Перезагрузка ИП-1";
			
			IPAddress host = IPAddress.Parse("127.0.0.1");
			int port = 23;
			string username = "admin";
			string password = "admin";
			string remoteHost = "127.0.0.1";
			long timeout = 1000;
			
			var xdoc = XDocument.Load("config.xml");
			var rootElement = xdoc.Root;
			
			foreach (var optionElement in rootElement.Elements("option"))
			{
				var nameAttr = optionElement.Attribute("name");
				var valueAttr = optionElement.Attribute("value");
				if (nameAttr == null || valueAttr == null)
					continue;
					
				switch (nameAttr.Value)
				{
					case "host":
						if (!IPAddress.TryParse(valueAttr.Value, out host))
							Console.WriteLine("Ошибка чтения параметра host.");
						break;
					case "username":
						username = valueAttr.Value;
						break;
					case "password":
						password = valueAttr.Value;
						break;
					case "remote_host":
						remoteHost = valueAttr.Value;
						break;
					case "timeout":
						if (!long.TryParse(valueAttr.Value, out timeout))
							Console.WriteLine("Ошибка чтения параметра timeout.");
						break;
					case "port":
						if (!int.TryParse(valueAttr.Value, out port))
							Console.WriteLine("Ошибка чтения параметра port.");
						break;	
					default: continue;
				}
			}
			
			var endPoint = new IPEndPoint(host, port);
			var client = new TcpClient();
			client.Connect(endPoint);
			
			var response = ReadTelnet(client, timeout, "login:");
			Console.WriteLine(response);
		
			Console.ReadLine();
		}
		
		private string ReadTelnet(TcpClient client, long timeout = 1000, string pattern = null)
		{
			for (long i = 0; i < timeout; i++)
			{
				NetworkStream stream = client.GetStream();
				
				// if (client.ReceiveBufferSize <= 0 || !stream.CanRead || !stream.DataAvailable)
				if (client.ReceiveBufferSize <= 0)
					continue;
					
				do
				{
					System.Threading.Thread.Sleep(10000);
					
					byte[] buffer = new byte[client.ReceiveBufferSize];
					int p = stream.Read(buffer, 0, client.ReceiveBufferSize);
					
					string response = Encoding.ASCII.GetString(buffer).Trim();
					Console.WriteLine(string.Format("{0}. {1}", i, response));
					//for (var j = 0; j < buffer.Length; j++)
					//	Console.Write(buffer[j]);
					
					if (response == "")
						continue;
						
					if (pattern != null)
					{
						Regex objToMatch = new Regex(pattern);
						if (objToMatch.IsMatch(response)) 
						{
						   return response;
						}
					}
					
					return response;
				}
				while (stream.DataAvailable);
			}
			
			return null;
		}
		
		private string WriteTelnet(TcpClient client, string command, long timeout)
		{
			return ReadTelnet(client, timeout);
		}
	}
}


Вся суть в том, что берем Telnet сервер (допустим HK Telnet Server) для теста подключения. Соединяемся, считываем данные и получаем вполне себе нормальное сообщение приветствия. т.е. все работает.

Идем дальше. Код пишется для коннекта к Telnet серверу, который работает на WinCE. Когда тестю на HK Server все нормально, когда начинаю тестить на WinCE, то в ответ получаю сообщение "???" и смайлик. В чем подвох?

При этом подмечу, что стандартный клиент Telnet Windows 7 коннектится и работает с обоими серваками нормально.

Вот проблемный:
5d674d9900035084640967.png

Вот нормальный:
5d674e01711c3172504620.png

UPD.. #1 Забавно. Стучусь на FTP - ответ нормальный. Telnet выдает все так же.
5d6773feb8ff7011421047.png
  • Вопрос задан
  • 3342 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
mindtester
@mindtester Куратор тега C#
http://iczin.su/hexagram_48
Когда тестю на HK Server все нормально, когда начинаю тестить на WinCE, то в ответ получаю сообщение "???" и смайлик. В чем подвох?
в кодировке ответа
Ответ написан
@Sumor
Попробуйте вместо
string response = Encoding.ASCII.GetString(buffer).Trim();

string response = Encoding.GetEncoding(1251).GetString(buffer).Trim();

И ещё проблема может быть в том, что консоль, в которой вы выполняете настроена на однобайтную кодировку, а вы через Console.WriteLine выводите unicode.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы