2017-11-20 8 views
0

Cap'n proto를 사용하여 여러 클라이언트와 웹 소켓 서버간에 메시지를 보내고 가져옵니다.Cap'n Proto에서 여러 메시지 유형을 구분하는 방법은 무엇입니까?

데이터를 보내고받을 수있는 웹 소켓 채널이 하나 뿐이므로 다양한 유형의 메시지를 보낼 수 있으므로 디코드 할 때 구분할 방법이 필요합니다.

어떻게 이것이 Cap'n proto에서 올바르게 수행 될 수 있습니까?

이 질문은 언어에 무관심하다고 생각하지만 언어가 필요한 경우 내 서버가 녹, 이동 및 자바 스크립트에 있으므로 이러한 언어로 모두 작동하는 솔루션을 높이 평가할 수 있습니다.

답변

1

할 수있는 가장 좋은 방법은 모든 가능한 유형의 합집합 인 외부 구조체를 만드는 것입니다. 당신이 유형 Foo, BarBaz이있는 경우 예를 들어, 같은 유형의 정의 :

struct Outer { 
    union { 
    foo @0 :Foo; 
    bar @1 :Bar; 
    baz @2 :Baz; 
    } 
} 

어떻게 노동 조합은 언어에 따라 달라 액세스 할 수 있지만, 일반적으로 열거 값 지정을 반환하는 which() 방법이있다을하는 필드를 채운 다음 중첩 된 구조체에 일반 getter 메서드를 사용합니다.

양끝은 Outer 유형을 사용해야합니다. 루트 유형이 Foo 인 메시지를 직렬화 한 다음 Outer으로 구문 분석 할 수 없습니다. 메시지는 Outer 유형으로 만들어야합니다. 일반적으로 바이트만으로 다른 Cap'n Proto 유형을 구별 할 수있는 방법은 없습니다.