Idk whats wrong C# 套接字读取问题

Idk whats wrong C# socket read problems

好的所以 iv 做了一种远程命令操作员。它由服务器和客户端两部分组成,客户端发送命令,服务器执行命令,returns 输出。

现在为了一些响应我无法读取所有输出我只能读取几行然后它只是等待超时。

我像这样发送命令的输出 “[命令名称: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();
    }

现在在你问之前我确实确保所有数据都通过服务器端的套接字发送,只是没有被客户端完全读取。

private static void ReturnManager(Socket Soc)
    {

        //Thread.Sleep(100);
        using (StreamReader RS = new StreamReader(new NetworkStream(Soc)))
        {
            DateTime TMR = DateTime.Now;
            while (true)
            {
                while (RS.Peek() > 0 | Soc.Available > 0)
                {
                    Console.WriteLine(RS.ReadLine());
                    TMR = DateTime.Now;
                }
                if(DateTime.Now - TMR > TimeSpan.FromSeconds(LastReadTimeoutSeconds))
                {
                    try
                    {
                        if (!Soc.Connected) break;
                        else
                        {
                            Soc.Send(new byte[1] { 255 });//Verify that the Server is still keeping the Socket open thus the command is still active
                            TMR = DateTime.Now;
                        }
                    }
                    catch
                    {
                        break;
                    }
                }
            }
        }
        Soc.Close();
        Soc.Dispose();
    }

我让它像这样工作,它现在将读取所有数据,直到套接字关闭或停止接受传入数据包。