Idk什么是错误的C#套接字读取问题

时间:2018-02-10 19:17:33

标签: c# sockets networkstream

好吧所以我做了一个远程命令操作符。它由服务器和客户端两部分组成,客户端发送命令,服务器执行它并返回输出。

现在对于某些人来说,我无法读取所有输出,我只能阅读几行,然后等待超时。

我发送命令的输出就像这样 " [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 个答案:

答案 0 :(得分:0)

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();
    }

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