2014-10-14 1 views
-1

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

      } 
     } 
+3

단순히 'socketReader.ReadLine'을 사용하지 않는 이유는 무엇입니까? CRLF를 볼 때 줄을 반환합니다. '.' 만있는 줄은 * tr30mission * –

+0

의 끝을 의미 할 수 있으며 그 이유는 무엇입니까? 이 질문에 대한 의견을 듣고 도움을 줄 수 있습니까? – Damo

답변

0

ReadBlock은 차단 읽기 하지입니다. 전화에 지정된 최대 문자 수 (귀하의 경우 40 자)까지 즉시 반환됩니다.

메서드는 카운트 문자가 읽히거나 스트림의 끝에 도달 할 때까지 차단됩니다. 이것은 읽기의 차단 버전입니다. 호출이 반환 즉시 필요한

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

당신은 단순히 CRLF에 대한 버퍼를 확인할 수 있습니다.

또는 주석에 제안 된대로 ReadLine()이 사용자의 요구에 적합 할 수 있습니다.

+0

그것은 내가 그것을 복잡하게하고 있었던 것처럼 보인다. ReadLine()이이를 해결했습니다. – Damo

관련 문제