C# 在缓冲区已满之前检测缓冲区中的字符

C# 在缓冲区已满之前检测缓冲区中的字符,c#,smtp,buffer,streamreader,tcplistener,C#,Smtp,Buffer,Streamreader,Tcplistener,我正在编写一个SMTP服务器作为学习TCP套接字的练习 我遇到了一个障碍,需要通过检测缓冲区中是否存在来退出ReadBlock。连接到SMTP服务器的客户端将以结束当前的数据传输顺序。 然而,我不知道最好的处理方法 我可以编写一个计时器,定期检查的当前缓冲区,但这对我来说效率很低 通过检测,中断读取的最佳方法是什么 ReadBlock不是块读。它将立即返回,最多返回调用中指定的最大字符数(本例中为40) 该方法阻塞,直到读取计数字符或到达流的结尾。这是Read的阻塞版本 一旦呼叫返回,您只需根

我正在编写一个SMTP服务器作为学习TCP套接字的练习

我遇到了一个障碍,需要通过检测缓冲区中是否存在
来退出ReadBlock。连接到SMTP服务器的客户端将以
结束当前的数据传输顺序。

然而,我不知道最好的处理方法

我可以编写一个计时器,定期检查
的当前缓冲区,但这对我来说效率很低

通过检测
,中断读取的最佳方法是什么

ReadBlock
不是块读。它将立即返回,最多返回调用中指定的最大字符数(本例中为40)

该方法阻塞,直到读取计数字符或到达流的结尾。这是Read的阻塞版本

一旦呼叫返回,您只需根据需要检查缓冲区中的CRLF


或者,正如评论中所建议的,ReadLine()可能适合您的需要。

为什么不简单地使用
socketReader.ReadLine
?当它看到CRLF时,它将返回一行。只有
的一行可能意味着任务的结束,为什么?也许可以评论一下,帮助我理解这是一个多么糟糕的问题?似乎我把它复杂化了。ReadLine()为我解决了这个问题。
private static void Service()
        {
            while (true)
            {
                var theSocket = _listener.AcceptSocket();

                Console.WriteLine("Connected: {0}",theSocket.RemoteEndPoint);

                try
                {
                    Stream s = new NetworkStream(theSocket);

                    var socketReader = new StreamReader(s);     
                    var socketWriter = new StreamWriter(s) {AutoFlush = true};

                    socketWriter.WriteLine("Hello {0}",theSocket.RemoteEndPoint);

                    using (var fileWriter = new StreamWriter(@"E:\test\tmp.txt",true))
                    {                        
                        do
                        {
                            fileWriter.WriteLine(theSocket.RemoteEndPoint);

                            char[] buf = new char[40];
                            int read = socketReader.ReadBlock(buf, 0, 40);

                            while (read != 0)
                            {
                                fileWriter.Write(buf,0,read);
                                fileWriter.WriteLine();
                                read = socketReader.ReadBlock(buf, 0, 40);                             
                            }                            
                        } while (true);

                    }                    
                    s.Close();                  
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);                   
                }

                Console.WriteLine("Disconnected: " +  theSocket.RemoteEndPoint);

                theSocket.Close();

            }
        }