2011-09-25 3 views
0

Socket.BeginReceive()에 의해 할당 된 콜백이 일부 바이트를 가져올 때 전체 메시지를 가지고있는 가장 좋은 방법은 무엇입니까? 내가 보내는 각 메시지의 처음 4 바이트는 메시지의 길이를 유지해야합니까?Socket.BeginReceive 콜백 - 메시지 분리 자

메시지 구분 기호로 사용할 수있는 고유 한 문자가 없도록 각 메시지에 XML 파일을 보내고 있습니다.

+0

예. 먼저 길이를 보내는 것이 간단한 해결책입니다. –

답변

1

2 개의 정수 (각 4 바이트)를 포함하는 헤더를 사용합니다. 첫 번째 메시지는 프로토콜 버전을 나타내고 두 번째 메시지 길이는 메시지 길이를 나타냅니다. 구분 기호 대신 머리글 길이를 사용하는 것이 좋은 이유는 메시지를 파싱하기 전에 전체 메시지에 대해 버퍼를 할당 할 수 있다는 것입니다.

첫 번째 헤더로 버전 정수를 사용하여 프로토콜의 최신 버전에서 나머지 머리글과 본문을 변경해 보겠습니다. 헤더에 버전 번호의 차이와 실제 메시지의 하나가 주석

에 회신

업데이트. 메시지 버전은 문서 용이지만 헤더 버전은 프로토콜 자체 용입니다. 프로토콜 버전을 사용하면 메시지 전송을 XML에서 Protobuf 또는 메시지의 다른 것으로 전환 할 수 있습니다. 실제 메시지의 대상을 식별하는 헤더를 추가 할 수도 있습니다.

+0

버전 번호에 대한 좋은 제안. 그러나 우리는 우리의 메시지 (루트 노드의 속성)에서 그렇게 필요하지 않습니다. 그러나 우리가 그렇게하지 않으면, 그것을 처리하는 좋은 방법이 될 것입니다. 고맙습니다. –

+0

내 업데이트를 읽었습니다. – jgauffin

+0

좋은 지적. 우리의 사용은 일회성 이벤트이지만 그 경우에도 해를 끼치 지 않습니다. –

2

사용중인 프로토콜에 대한 사양을 따르십시오. 원래 프로토콜 인 경우 사양을 작성하십시오. 그것은 약간의 추가 작업이지만, 그만한 가치가 있습니다.

해당 사양에서는 메시지 길이를 지정할 수 있습니다. 페이로드에서 특정 바이트 (사용자 0이 될 수 있음)를 금지하고이를 메시지 구분자로 사용할 수도 있습니다. XML을 사용하기 때문에 메시지를 나타내는 태그를 정의 할 수 있습니다. 태그를 닫으면 완전한 메시지가 표시됩니다.

귀하에게 달려 있습니다. 그러나 프로토콜을 상세하게 지정하는 데 시간을 보내십시오. 갚을 것을 약속드립니다.

+0

XML에 0이 포함 된 CDATA [[]]가있을 수 있기 때문에 0은 작동하지 않을 것이라고 생각합니다. 태그를 생각했지만 XML을 구문 분석하여 끝 부분을 찾아야하므로 계산 비용이 많이 든다. –

+0

어쨌든 XML을 구문 분석 할 필요가 없습니까? –

+0

일단 XML이 완성되면 파싱해야합니다. 그러나 그것이 6 블록에 도착한다면, 나는 6 번째이자 마지막 블록을 얻을 때 그것을 파싱하는 것을 선호 할 것입니다. –