TCP 소켓킹을 배우는 연습으로 SMTP 서버를 작성하고 있습니다.버퍼가 가득 차기 전에 버퍼의 char을 감지하십시오.
나는 버퍼에서 <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를 볼 때 줄을 반환합니다. '.' 만있는 줄은 * tr30mission * –
의 끝을 의미 할 수 있으며 그 이유는 무엇입니까? 이 질문에 대한 의견을 듣고 도움을 줄 수 있습니까? – Damo