【发布时间】:2011-12-06 14:49:57
【问题描述】:
我是一名程序员,所以基本上又是新手。
我正在做的是通过 Telnet 或 TCP 登录设备。我没有通过类型命令控制设备,而是使用自定义表单应用程序通过预编程的按钮发送类型字符串命令。该设备是旧的编解码器。我的软件的目的是创建一个可在 PC 上使用的按钮控制器。
我遇到的问题是我的一些设备受密码保护,而另一些则没有(不同的固件)。这是无法改变的。密码保护让我陷入了困境。
我正在使用 ASCII 向设备发送数据
public void Write(string cmd)
{
if (!tcpSocket.Connected) return;
byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("\0xFF", "\0xFF\0xFF"));
tcpSocket.GetStream().Write(buf, 0, buf.Length);
我一直在 MD5 上搜索并且卡住了。 我尝试通过在文本框中输入密码并启动写入命令的纯文本来发送密码。我也尝试过发送我在互联网上找到的这段代码的输出
public string EncodePassword(string originalPassword)
{
//Declarations
Byte[] originalBytes;
Byte[] encodedBytes;
MD5 md5;
//Instantiate MD5CryptoServiceProvider, get bytes for original password and compute hash (encoded password)
md5 = new MD5CryptoServiceProvider();
originalBytes = ASCIIEncoding.Default.GetBytes(originalPassword);
encodedBytes = md5.ComputeHash(originalBytes);
//Convert encoded bytes back to a 'readable' string
return BitConverter.ToString(encodedBytes);
我什至发现了另一个强制大小写的 MD5 行。我不知道它是否不起作用,因为它仍在以 ASCII 或什么形式发送编码密码。
我知道我的密码是正确的,因为我可以在 Windows 中加载 telnet 并在那里正常登录。任何帮助让这个客户端通过服务器进行身份验证将不胜感激。
请原谅长度。由于我无法回复,我不得不编辑。我认为我对 MD5 感到困惑......阅读回复后,我认为我的问题是 ASCII。我需要纯文本。
好的,这就是我的初学者条纹闪耀的地方。这是我第一次尝试涉及任何类型的网络的编程(如果它还不是那么明显的话)。通过阅读回复,我认为我的第一个问题是 ASCII。我假设发送的是纯文本。鉴于当我使用不需要密码登录的同一客户端连接到服务器时...... ASCII 工作得很好。
如果我要使用纯文本,那么我将如何发送纯文本而不是字节转换?假设我假设 ASCII 是发送纯文本的方式是错误的......我现在认为它是。
我添加了更多代码来帮助解决这个问题。
使用 Windows telnet 客户端时,设备会提示输入密码,当您在 telnet 中输入密码时,直到登录后才会显示任何文本。登录后,所有输入都会立即显示。
用于套接字的类主要是我在谷歌上找到的一段代码。
using System;
using System.Collections.Generic;
using System.Text;
using System.Net.Sockets;
namespace STC_Control
{
enum Verbs
{
WILL = 251,
WONT = 252,
DO = 253,
DONT = 254,
IAC = 255
}
enum Options
{
SGA = 3
}
class TelnetConnection
{
TcpClient tcpSocket;
int TimeOutMs = 100;
public TelnetConnection(string Hostname, int Port)
{
tcpSocket = new TcpClient(Hostname, Port);
}
public void WriteLine(string cmd)
{
Write(cmd + "\n");
}
public void Write(string cmd)
{
if (!tcpSocket.Connected) return;
byte[] buf = System.Text.ASCIIEncoding.ASCII.GetBytes(cmd.Replace("\0xFF", "\0xFF\0xFF"));
tcpSocket.GetStream().Write(buf, 0, buf.Length);
}
public string Read()
{
if (!tcpSocket.Connected) return null;
StringBuilder sb = new StringBuilder();
do
{
ParseTelnet(sb);
System.Threading.Thread.Sleep(TimeOutMs);
} while (tcpSocket.Available > 0);
return sb.ToString();
}
public bool IsConnected
{
get { return tcpSocket.Connected; }
}
void ParseTelnet(StringBuilder sb)
{
while (tcpSocket.Available > 0)
{
int input = tcpSocket.GetStream().ReadByte();
switch (input)
{
case -1:
break;
case (int)Verbs.IAC:
// interpret as command
int inputverb = tcpSocket.GetStream().ReadByte();
if (inputverb == -1) break;
switch (inputverb)
{
case (int)Verbs.IAC:
//literal IAC = 255 escaped, so append char 255 to string
sb.Append(inputverb);
break;
case (int)Verbs.DO:
case (int)Verbs.DONT:
case (int)Verbs.WILL:
case (int)Verbs.WONT:
// reply to all commands with "WONT", unless it is SGA (suppres go ahead)
int inputoption = tcpSocket.GetStream().ReadByte();
if (inputoption == -1) break;
tcpSocket.GetStream().WriteByte((byte)Verbs.IAC);
if (inputoption == (int)Options.SGA)
tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WILL : (byte)Verbs.DO);
else
tcpSocket.GetStream().WriteByte(inputverb == (int)Verbs.DO ? (byte)Verbs.WONT : (byte)Verbs.DONT);
tcpSocket.GetStream().WriteByte((byte)inputoption);
break;
default:
break;
}
break;
default:
sb.Append((char)input);
break;
}
}
}
}
}
然后是程序
public Form1()
{
InitializeComponent();
}
//declorations
TelnetConnection tc;
Int16 vl = 13;
private void connect_Click(object sender, EventArgs e)
{
if (string.IsNullOrEmpty(roomBox.Text))
{
MessageBox.Show("Please enter a selection before continuing");
}
else
{
{
try
{
//Connects to the server
tc = new TelnetConnection(roomBox.Text, 23);
//Enables controls
panelAll.Enabled = true;
}
catch
{
MessageBox.Show("Server Unreachable. ");
panelAll.Enabled = false;
cState.Text = "Disconnected";
}
}
}
// Button to send login password Temp created to test login
public void p_Click(object sender, EventArgs e)
{
try
{
//sends text to server
tc.WriteLine("PASSWORD");
//enables Buttons
panelAll.Enabled = true;
//displays return to textbox to verify login or disconnect
rx.Text = (tc.Read());
}
catch
{
panelAll.Enabled = false;
MessageBox.Show("Communication with device was lost.");
cState.Text = "Disconnected";
}
}
----------------------------------------------- -------------------------------------------------------
【问题讨论】:
-
文本不显示是因为设备没有回显它,而不是因为有加密。如果它是一个纯粹的 telnet 接口,那么这无疑是个问题。以纯文本形式发送密码。 (耶!终于可以在任何地方发表评论了......多么烦人的“徽章”必须等待)。
-
问题已解决。是客户端的协商协议有问题。
标签: c# .net networking telnet