【发布时间】: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