【问题标题】:Detect char in buffer before buffer is full在缓冲区满之前检测缓冲区中的字符
【发布时间】:2014-10-15 05:07:47
【问题描述】:

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

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

但是,我不知道处理此问题的最佳方法。

我可以编写一个计时器来定期检查<CRLF>.<CRLF> 的当前缓冲区,但这对我来说似乎效率低下。

通过检测<CRLF>.<CRLF> 突破阅读的最佳方法是什么?

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

            }
        }

【问题讨论】:

  • 你为什么不简单地使用socketReader.ReadLine?它会在看到 CRLF 时返回一行。只有. 的行可能意味着传输结束
  • 为什么投反对票?也许发表评论并帮助我理解这是一个糟糕的问题?

标签: c# smtp buffer streamreader tcplistener


【解决方案1】:

ReadBlock 不是阻塞读取。它将立即返回,最多可包含调用中指定的最大字符数(在您的情况下为 40 个)。

该方法一直阻塞,直到读取了 count 个字符,或者到达了流的末尾。这是 Read 的阻塞版本。

http://msdn.microsoft.com/en-us/library/system.io.streamreader.readblock(v=vs.110).aspx

您可以在调用返回后立即根据需要检查缓冲区中的 CRLF。

或者按照 cmets 中的建议,ReadLine() 可能适合您的需求。

【讨论】:

  • 看来我把它复杂化了。 ReadLine() 为我解决了这个问题。
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2012-05-27
相关资源
最近更新 更多