C# Minimaslistic Telnet库-将输出读取到底
我正在从事一个项目,在这个项目中,我应该在Unix服务器上运行命令,并获得这些命令的完整输出。为此,我使用代码项目()中的MinimasListicTelnet库。现在,除了输出之外,其他一切都正常工作,因为我想全部阅读,而不仅仅是其中的一部分。我可以使用可能需要很长时间的命令。以下是Minimaslistic Telnet库中的读取输出方法:C# Minimaslistic Telnet库-将输出读取到底,c#,telnet,C#,Telnet,我正在从事一个项目,在这个项目中,我应该在Unix服务器上运行命令,并获得这些命令的完整输出。为此,我使用代码项目()中的MinimasListicTelnet库。现在,除了输出之外,其他一切都正常工作,因为我想全部阅读,而不仅仅是其中的一部分。我可以使用可能需要很长时间的命令。以下是Minimaslistic Telnet库中的读取输出方法: public string Read() { if (!tcpSocket.Connected) return null; String
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();
}
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;
}
}
}
这个代码示例读取输出,但异步地,我需要它在退出之前等待输出。有没有关于修改代码以满足我的要求的想法?谢谢大家! 我同意Joachim的观点,在循环中调用read并解析输出是最好的方法。不幸的是,我执行的每个命令的输出都没有一个标准化的结尾。相反,我使用流的读取超时来近似输出的结束(我意识到这并不完美)。我设置了更高的初始超时以允许数据开始流动,然后降低了超时以找到输出的结尾。它看起来像这样:
static string ReadFromStream(int initialTimeout, int subsequentTimeout)
{
// Initialize output
string output = null;
try
{
// Set initial read timeout -- This is needed because occasionally
// it takes a while before data starts flowing
stream.ReadTimeout = initialTimeout;
while (stream.CanRead)
{
// Read bytes in from stream
readBuffer = new byte[tcpClient.ReceiveBufferSize];
stream.Read(readBuffer, 0, tcpClient.ReceiveBufferSize);
// Convert the bytes to string and save to output
output = string.Format("{0}{1}", output, Encoding.ASCII.GetString(readBuffer).Trim());
// Set subsequent read timeout
stream.ReadTimeout = subsequentTimeout;
}
}
// Since we don't know when the output will end, we wait for, and catch the timeout
catch (IOException) { }
// Return output
return output;
}
这不是Telnet协议的问题,而是底层协议TCP的问题。TCP是一种流协议,没有起点也没有终点。TCP(或Telnet)如何知道某个特定“命令”的输出何时完成?它们不能,相反,您必须在更高的级别上解析您读取的数据,以尝试确定您接收的数据何时完成。也就是说,您必须在循环中调用
Read
,并解析数据以确定结束。我明白了,那么我可以使用另一个支持同步读取的协议重新实现相同的功能吗?请提供帮助?