Пытаюсь подключится к 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 коннектится и работает с обоими серваками нормально.
Вот проблемный:
Вот нормальный:
UPD.. #1 Забавно. Стучусь на FTP - ответ нормальный. Telnet выдает все так же.