문제

누군가가 프로토콜 버퍼를 사용하는 방법을 도와주세요. 실제로 시뮬레이션 연구를 실행하기 위해 UNIX에서 실행하는 프로그램과 Windows에서 실행되는 Anoother 간의 소켓을 통해 데이터를 교환하고 싶습니다.

소켓을 사용하여 데이터를 교환하고 C/C ++로 작성된 프로그램은 Somneone이 데이터를 교환하기 위해 프로토콜 버퍼를 사용하는 데 도움이 될 수 있다면 기뻐할 것입니다.

struct snd_data{
    char *var="temp";
    int var1=1;
    float var2;
    double var2;
}

여러 가지 방법을 시도했지만 여전히 데이터는 올바르게 교환되지 않습니다. 모든 도움은 대단히 감사 할 것입니다

당신의 도움을 주셔서 감사합니다,

도움이 되었습니까?

해결책

.proto 파일로 메시지를 정의하는 것으로 시작합니다.

package foo;

message snd_data {
  required string var= 1;
  required int32 var1 = 2;
  optional float var2 = 3;
  optional double var3 = 4;
}

(플로트와 두 배는 실제로 다른 변수 인 것 같아요 ...)

그런 다음 사용하여 컴파일합니다 protoc 그런 다음 버퍼를 구현하는 코드가 있습니다.

자세한 내용은 다음을 참조하십시오. http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

다른 팁

소켓에 메시지를 어떻게 작성하고 있습니까? protobufs는 엔디 언에 민감하지는 않지만 프로토 비프는 전송 메커니즘을 정의하지 않습니다. protobuf는 메시지와 해당 직렬 형식 (8 비트) 바이트의 시퀀스 사이의 매핑을 정의합니다. 당신의 이 바이트 시퀀스를 원격 호스트로 전송할 책임이 있습니다.

우리의 경우, 우리는 매우 간단한 전송 프로토콜을 정의합니다. 먼저 우리는 메시지 크기를 32 비트 정수 (Big Endian)로 씁니다. 그런 다음 메시지 자체가 온다. (또한 protobuf 메시지는 자체 식별이 아니라는 것을 기억하십시오. 즉, 어떤 메시지가 보내는 지 알아야합니다. 일반적으로 래퍼 메시지 전송하려는 모든 메시지에 대한 선택 필드가 포함되어 있습니다. 이 기술에 대한 자세한 내용은 Protobuf 웹 사이트 및 메일 링리스트 아카이브를 참조하십시오.)

두 머신 x86입니까? 그렇지 않으면 Big Endian과 Little Endian의 차이를 지켜봐야합니다. 또한 Struct Packing에주의를 기울일 가치가 있습니다. 사실 포인터가 다른 플랫폼마다 크기가 다르기 때문에 통과 포인터도 문제가 될 수 있습니다. 게시물에는 정보가 너무 적습니다. 확실히 무엇이 잘못되고 있는지 ...

대답은 전송되는 데이터의 엔지니어에 있습니다. 이것은 매우 신중하게 고려하고 확인해야 할 것입니다. 바라보다 여기 Endianness가 무엇을 할 수 있는지 보여주고 수신기와 발신자 모두에 데이터가 엉망이됩니다. UNIX 박스에서 전송 된 데이터가 Windows 상자의 데이터가 데이터의 메모리 구조 측면에서 동일한 순서가되기 때문에 데이터를 원활하게 전송하는 완벽한 측정 값은 없습니다. 또한 UNIX 박스의 구조물 패딩은 Wind

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top