2017-10-11 11 views
0

저는 Cap'n Proto를 UDS를 통해 통신하는 클라이언트와 서버로 구성된 기존 프로젝트에 사용하려고합니다. 모든 클라이언트 - 서버 RPC를 재실행 할 수있는 자원이 없지만 받아 들일 수 있을지는 모르겠지만 Cap'n Proto 직렬화 메커니즘의 이점을 원했습니다. 불행히도 그것은 불가능한 것처럼 보입니다.부분적으로 Cap'n Proto 메시지 읽기/쓰기

가장 큰 문제는 단일 스레드 인 서버 측 (다중 스레드에 심각한 인수가없는 경우에도 그대로 유지됨)이며 자체 폴링 기반 루프를 사용합니다. 모든 이벤트는 부분적으로 읽혀지며, 서버는 모든 이벤트가 완전히 읽히기를 기다리는 것을 차단할 수 없습니다. 이것이 내가 멈추는 곳입니다. 우리는 우리 자신의 프로토콜과 메시지를 감쌀 수있는 클래스를 가지고 있습니다.이 프로토콜은 파일 디스크립터의 바이트를 소비하고 이벤트가 완전히 읽혀질 때이를 알려 서버가 처리 할 수 ​​있도록합니다. 나는 Cap'n Proto 인터페이스 (직렬화, 비동기 직렬화)의 대부분을 분석 한 것으로 보이며 수정없이 같은 방식으로 사용할 수 없다고 생각합니다.

정말보고 싶었습니다. 내가 그랬어?

답변

1

는이 문제를 해결 할 수있는 두 가지 방법이 있습니다 :

  • 하드 방법 : 당신은 내가 비동기 KJ와 통합을 시도 할 수 있습니다/(캡의 프로토에서 사용) O 프레임 워크. KJ 이벤트 루프는 실제로 다른 이벤트 루프와 통합되어 그 위에 실행될 수 있습니다. 그러나 까다 롭습니다. 예를 들어, node-capnp에는 this source file의 첫 번째 부분에서 볼 수 있듯이 KJ 이벤트 루프를 libuv와 통합하는 코드가 포함되어 있습니다. 필요한 접착제가 있으면 capnp/serialize-async.h의 인터페이스를 사용하는 KJ 스타일의 비동기 코드를 작성할 수 있습니다.
  • 쉬운 방법 : 대신 KJ를 통합하는 노력이 전체 메시지를 수신하면 알아 내기 위해 직접 파일 기술자로부터 데이터를 읽어 이벤트 인프라를 사용하여 간단한 코드를 쓴 후 (capnp/serialize.h에서) capnp::expectedSizeInWordsFromPrefix() 사용 아직. 이 함수가 이미 가지고있는 것보다 큰 숫자를 반환하면, 당신은 완전한 메시지를 가지지 않고 기다려야한다. 전체 메시지를 받으면 capnp::FlatArrayMessageReader을 사용하여 파싱 할 수 있습니다.
+0

감사합니다. 스택 오버플로에 적극적으로 참여하는 코드 작성자에게 정말 감사드립니다. – zoska

+0

packed 메시지에도 expectedSizeInWordsFromPrefix가 작동합니까? 나는 항상 거대한 숫자를 얻는다. – hunyadym

+0

@hunyadym 아니, 포장 된 메시지에는 작동하지 않는다. 압축 된 메시지에 이와 같은 것을 구현하는 것은 실제로 다소 어려울 것입니다. 명시 적으로 길이 접 두부 작성하는 것이 더 나을 것입니다. :/나는이 문제를 제기했다 : https://github.com/capnproto/capnproto/issues/590 –