2016-06-15 4 views
-1

현재 17 바이트 일 때마다 데이터를 수신하고 있습니다. 그러나 17 바이트와 10 바이트의 두 가지 유형의 데이터가 있습니다. 두 가지 유형의 데이터가있을 때 어떻게 처리 할 수 ​​있습니까?TCP 클라이언트 데이터 수신

 byte[] message = new byte[17]; 
     int bytesRead; 

     while (true) 
     { 
      bytesRead = 0; 

      try 
      { 
       //blocks until a client sends a message 
       bytesRead = clientStream.Read(message, 0, 17); 

      } 
      catch 
      { 
       //a socket error has occured 
       break; 
      } 

      if (bytesRead == 0) 
      { 
       //the client has disconnected from the server 
       break; 
      } 

비슷한 질문이 있지만 C 언어로되어있어 이해할 수 없습니다. 친절하게 도와주세요.

+1

메시지 프레이밍을 제공하려면 응용 프로그램 프로토콜이 필요합니다. 이제 17 바이트 메시지를 받았다고 가정하고 있지만 10 바이트 메시지와 다음 메시지의 처음 7 바이트를 읽을 수 있습니다. 우리는 당신을 위해 이것을 대답 할 수 없습니다. – CodeCaster

+1

데이터 유형을 18 및 11 바이트로 지정할 수 있습니다. 첫 번째 바이트는 신원 확인 자입니다. 1 바이트를 읽은 다음, 메시지 유형을 테스트하여 10 또는 17 바이트를 읽어야하는지 확인합니다. 그런 다음 데이터 바이트를 읽습니다. – Holger

+0

@ 코드 캐스터 감사합니다. 당신의 제안을 시도 할 것입니다. – active92

답변

2

스트림 기반 프로토콜 (예 : TCP) 위에 메시지 교환을 구현하려고합니다. 메시지는 다른 길이 및/또는 유형이 때, 두 가지 일반적인 방법

  • 액자 메시지가 있습니다 : 각 메시지는 메시지의 길이와 유형 및 가능한 다른 메타 데이터를 포함 알려진 길이의 헤더로 구성됩니다 (예 : 타임 스탬프). 헤더를 판독 한 후에, 적절한 양의 바이트 (즉, 페이로드)가 스트림으로부터 판독된다.
  • 자체 구분 메시지 : 메시지의 끝은 지금까지 읽은 스트림의 내용으로 감지 할 수 있습니다. 자체 분리를위한 한 가지 예는 HTTP 헤더입니다.이 헤더는 이중 개행 (2x CRLF)으로 구분됩니다.

IMHO 프레임 메시지는 읽을 바이트 수를 항상 알고 있기 때문에 구현하기가 쉽습니다. 자체 분리 메시지의 경우 버퍼링 및 구문 분석을 사용하여 메시지의 끝을 감지해야합니다. 또한 메시지 끝 부분이 메시지의 페이로드에 나타나지 않는지 확인해야합니다.

프레임 된 메시징 프로토콜의 수신 측을 구현하려면 System.IO.BinaryReader 클래스를 사용할 수 있습니다.

  • 는 메시지
  • Read(Byte[], Int32, Int32)를 사용하여 페이로드를 읽을 이상 255 바이트가 될 것입니다 경우 ReadByte() 또는 ReadUInt*() 방법 중 하나를 사용하여 메시지의 길이를 읽어 보시기 바랍니다. Read은 지정된 바이트보다 적은 바이트 수를 읽은 경우에도 반환 될 수 있습니다.byte[] message을 채우기 위해 루프를 사용해야합니다.
+0

자세한 설명을 주셔서 감사합니다. 필자는 프레임 된 메시지를 구현하기로 결정했습니다. – active92