C# Minimaslistic Telnet库-将输出读取到底

C# Minimaslistic Telnet库-将输出读取到底,c#,telnet,C#,Telnet,我正在从事一个项目,在这个项目中,我应该在Unix服务器上运行命令,并获得这些命令的完整输出。为此,我使用代码项目()中的MinimasListicTelnet库。现在,除了输出之外,其他一切都正常工作,因为我想全部阅读,而不仅仅是其中的一部分。我可以使用可能需要很长时间的命令。以下是Minimaslistic Telnet库中的读取输出方法: public string Read() { if (!tcpSocket.Connected) return null; String

我正在从事一个项目,在这个项目中,我应该在Unix服务器上运行命令,并获得这些命令的完整输出。为此,我使用代码项目()中的MinimasListicTelnet库。现在,除了输出之外,其他一切都正常工作,因为我想全部阅读,而不仅仅是其中的一部分。我可以使用可能需要很长时间的命令。以下是Minimaslistic Telnet库中的读取输出方法:

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
,并解析数据以确定结束。我明白了,那么我可以使用另一个支持同步读取的协议重新实现相同的功能吗?请提供帮助?