我有以下代码,它成功地允许我打开一个到telnet服务器的套接字并协商适当的握手,如下所示。
Established Connection to 192.168.10.33
FF FD 18 FF FD 20 FF FD 23 FF FD 27 FF FD 24 ÿy.ÿy.ÿy#ÿy'ÿy$
FF FB 03 FF FD 01 FF FD 22 FF FD 1F FF FB 05 FF ÿû.ÿy.ÿy"ÿy.ÿû.ÿ
FD 21 y!
FF FB 01 FF FD 06 FF FD 00 ÿû.ÿy.ÿy.
FF FB 03 FF FB 01 ÿû.ÿû.
我陷入困境并且似乎缺少一些基本的东西是如何在完成上述握手后从telnet读回连续的数据流。
这是概念。我发送一个存储在xml文件中的telnet命令,并希望能够将来自telnet服务器的响应作为变量读回,我可以用它来显示回控制台并发送到应用程序中的其他方法。 使用putty作为客户,请参见下图以获得澄清:
我也无法收到0x0D 0x0A Welcome to the Tesira Text Protocol Server 0x0D 0x0A
欢迎信息,但我认为这只是更广泛问题的症状。
我可以发送命令:
Console.WriteLine("Item: "+item.Attributes["commandText"].Value);
byte[] commandBytes = Encoding.ASCII.GetBytes(item.Attributes["commandText"].Value + " \r\n");
s.Send(commandBytes);
但是我对如何回读数据感到有点迷茫。 下面的代码是我编写的用于处理套接字连接和握手方面的类。
我真的不知道接下来要去哪里,一直在寻找一个我能理解的好教程几个小时,但却没有找到任何真正帮助我的运气。
class telnetHandshake
{
private static byte[] writeBuffer;
private static byte[] readBuffer;
private static int bc;
public void telnetInit()
{
IPAddress address = IPAddress.Parse("192.168.10.33");
int port = 23;
IPEndPoint endpoint = new IPEndPoint(address, port);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
try
{
s.Connect(endpoint);
Console.WriteLine("Established Connection to {0}", address);
byte[] readBuffer = new byte[1024];
bc = s.Receive(readBuffer);
//Console.WriteLine(bc + " Bytes Found");
DumpBytes(readBuffer, bc);
writeBuffer = new byte[] { 0xFF, 0xFC, 0x18, 0xFF, 0xFC, 0x20, 0xFF, 0xFC, 0x23, 0xFF, 0xFC, 0x27, 0xFF, 0xFC, 0x24 };
s.Send(writeBuffer);
readBuffer = new byte[1024];
bc = s.Receive(readBuffer);
//Console.WriteLine(bc + " Bytes Found");
DumpBytes(readBuffer, bc);
writeBuffer = new byte[] { 0xFF, 0xFE, 0x03, 0xFF, 0xFC, 0x01, 0xFF, 0xFC, 0x22, 0xFF, 0xFC, 0x1F, 0xFF, 0xFE, 0x05, 0xFF, 0XFC, 0x21 };
s.Send(writeBuffer);
readBuffer = new byte[1024];
bc = s.Receive(readBuffer);
//Console.WriteLine(bc + " Bytes Found");
DumpBytes(readBuffer, bc);
writeBuffer = new byte[] { 0xFF, 0xFE, 0x01, 0xFF, 0xFC, 0x06, 0xFF, 0xFC, 0x00 };
s.Send(writeBuffer);
readBuffer = new byte[1024];
bc = s.Receive(readBuffer);
//Console.WriteLine(bc + " Bytes Found");
DumpBytes(readBuffer, bc);
writeBuffer = new byte[] { 0xFF, 0xFE, 0x03, 0xFF, 0xFE, 0x01 };
s.Send(writeBuffer);
readBuffer = new byte[1024];
bc = s.Receive(readBuffer);
//Console.WriteLine(bc + " Bytes Found");
DumpBytes(readBuffer, bc);
}
catch
{
Console.WriteLine("Connection to {0} Failed!", address);
}
}
我不想使用最小的telnet或任何其他库,我想学习如何完成我已经开始的工作,因为我觉得我非常接近这一点,以至于它对我的目的有用
答案 0 :(得分:1)
我可以使用以下代码解决我的问题:
if (s.Receive(readBuffer) > 0)
{
Console.WriteLine(hex2string(readBuffer, s.Receive(readBuffer)));
}
握手完成后,我刚检查了是否有新数据,如果有可用数据,我将其读入一个函数,将其从HEX转换为ASCII。
这种方法适用于我,因为代码片段将在以下后调用:
byte[] commandBytes = Encoding.ASCII.GetBytes(item.Attributes["commandText"].Value + " \r\n");
s.Send(commandBytes);
所以每次提交新命令时都会有一个等待读取的静止。