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