Member 12646889 Ответов: 1

Я не могу прочитать полный вывод из гнезда


Итак, iv сделал своего рода удаленного оператора команды. он состоит из 2 секций сервер и клиент клиент посылает команду сервер выполняет ее и возвращает результат.

теперь для некоторого резонанса я не могу прочитать весь вывод, я могу прочитать только несколько строк, а затем он просто ждет тайм-аута.

я посылаю вывод команды примерно так "[CommandName:PID]:OneLineOfOutput\n", а затем это повторяется для каждой строки, которую выдала команда

а потом я пытаюсь читать эту строку за строкой, и когда мне нечего читать, я тайм-аут процесса чтения и жду новой команды для отправки на сервер.

вид материала, который его мент выводит, выглядит следующим образом
[ListCmds:1232]:ListCmds:0
[ListCmds:1232]:Shutdown:1
[ListCmds:1232]:FullSysShutdown:2
[ListCmds:1232]:Restart:3

и вот что я вижу на консоли
[ListCmds:1232]:ListCmds:0
[ListCmds:1232]:Shutdown:1

кажется, что он просто пропускает 2 строки.

мой код потока чтения
private static void ReturnManager(Socket Soc)
    {
        //Thread.Sleep(100);
        using (StreamReader RS = new StreamReader(new NetworkStream(Soc)))
        {
            DateTime TMR = DateTime.Now;
            while (true)
            {
                if (RS.Peek() > 0)
                {
                    Console.WriteLine(RS.ReadLine());
                    TMR = DateTime.Now;
                }
                if (!Soc.Connected)
                {
                    break;
                }
                if (DateTime.Now - TMR > TimeSpan.FromSeconds(LastReadTimeoutSeconds))
                {
                    break;
                }
                Thread.Sleep(20);
            }
        }
        Soc.Close();
        Soc.Dispose();
    }

теперь, прежде чем вы спросите, я действительно убедился, что все данные были отправлены через сокет на стороне serer, просто он не был полностью прочитан клиентом.

Что я уже пробовал:

я попытался добавить таймер ожидания к началу, но это не решает проблему, а просто затрудняет ее выполнение.

1 Ответов

Рейтинг:
2

RickZeeland

Я думаю, что вы не должны использовать StreamReader, смотрите пример здесь:
Сетевой поток.Метод Чтения (Byte[], Int32, Int32) (System.Net.Sockets)[^]