2016-10-19 5 views
0

후손을위한 제 작업 게시. 마지막 예제를 C++로 완성한 후에 실현되었는데 실제로 C에서 모든 것을 수행해야했습니다 (정말 멋지죠?). 두 반복 모두 자바 프로그래머로서 상당한 노력을 기울여 왔고 거기에 많은 샘플 코드가 너무 많은 구멍을 남겨두고 있다고 생각합니다. 예를 들어, 익숙한 누군가를 위해 커맨드 라인에서 상당히 어려운 건물에 대해서는 특히 Eclipse를 사용하여 프로젝트를 빌드하고 종속성을 처리합니다. 양조와 OSX에 대한 종속성을 설치하는 방법Simple Flatbuffers over ZeroMQ C 예제 - 구조체를 zmq의 flatbuffer로 복사 한 다음 구조체로 다시 복사하십시오.

:

brew install flatcc
brew install zeromq

당신은뿐만 아니라 설치된 모든 표준 빌더 바이너리가 필요합니다. 나는 컴파일하기 위해 GCC를 사용 :

gcc publisher.c -o bin/zmq_pub -lzmq -lflatcc
gcc subscriber.c -o bin/zmq_sub -lzmq

이것은 당신이 심볼릭 링크 얻을해야 zmq 및 flatcc 라이브러리를 설치 한 가정하여/양조 그들을 설치를 완료 한 후 USR// 지역은 다음과 같습니다. 이처럼 :

zmq_cpub $ls -la /usr/local/include lrwxr-xr-x 1 user group 37 Oct 18 18:43 flatcc -> ../Cellar/flatcc/0.3.4/include/flatcc

당신과 같은 컴파일 오류를 얻을 수 있습니다 : Undefined symbols for architecture x86_64: 당신이 라이브러리를 올바르게 설치/연결이없는 경우. 컴파일러/링커는 함수의 이름을 바꾸고 접두어를 _로 붙이면 잠재적으로 혼란 스러울 수 있습니다. _flatcc_builder_init이 아니더라도 Undefined symbols for architecture x86_64 _flatcc_builder_init처럼 말입니다.

C/C++의 라이브러리 연결이 Java와 근본적으로 다르기 때문입니다. JAR을 추가하는 특정 프로젝트 빌드 경로 대신 외부 C/C++ 라이브러리를 설치할 수있는 알려진 위치가 있습니다. /usr/local/include, /usr/local/lib, /usr/lib/usr/include.

그리고 당신의 경로에 flatcc 바이너리를 설치 한 후 로컬 프로젝트에서 사용하는 헤더 파일을 생성하는 것을 잊지 마세요 : 내 여행에 직면 거의 모든 장애물해야

flatcc -a Car.fbs

다운 C 레인. 누군가가 도움이되기를 바랍니다.

답변

0

Car.fbs

namespace Test; 

table Car { 
    name: string; 
    model: string; 
    year: int; 
} 
root_type Car; 

Subscriber.c는

// Hello World client 
#include "flatbuffers/Car_builder.h" // Generated by `flatcc`. 
#include "flatbuffers/flatbuffers_common_builder.h" 
#include <zmq.h> 

#undef ns 
#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(Test, x) // Specified in the schema 

struct Car { 
    char* name; 
    char* model; 
    int year; 
}; 

int main (void) 
{ 
    printf ("Connecting to car world server...\n"); 
    void *context = zmq_ctx_new(); 
    void *requester = zmq_socket (context, ZMQ_REQ); 
    zmq_connect (requester, "tcp://localhost:5555"); 

    int request_nbr; 
    for (request_nbr = 0; request_nbr != 10; request_nbr++) { 
     char buffer [1024]; 
     printf ("Sending ready signal %d...\n", request_nbr); 
     zmq_send (requester, "Hello", 5, 0); 
     zmq_recv (requester, buffer, 1024, 0); 
     printf ("Received car %d\n", request_nbr); 
     ns(Car_table_t) car = ns(Car_as_root(buffer)); 
     int year = ns(Car_year(car)); 
     flatbuffers_string_t model = ns(Car_model(car)); 
     flatbuffers_string_t name = ns(Car_name(car)); 

     struct Car nextCar; 
     // no need to double up on memory!! 
     // strcpy(nextCar.model, model); 
     // strcpy(nextCar.name, name); 
     nextCar.model = model; 
     nextCar.name = name; 
     nextCar.year = year; 

     printf("Year: %d\n", nextCar.year); 
     printf("Name: %s\n", nextCar.name); 
     printf("Model: %s\n", nextCar.model); 
    } 
    zmq_close (requester); 
    zmq_ctx_destroy (context); 
    return 0; 
} 

Publisher.c (zmq의 소켓을 통해 구조체를 전송) (수신 구조체를 수신) :

// Hello World server 

#include "flatbuffers/Car_builder.h" // Generated by `flatcc`. 
#include "flatbuffers/flatbuffers_common_builder.h" 
#include <zmq.h> 
#include <unistd.h> 
#include <time.h> 

#undef ns 
#define ns(x) FLATBUFFERS_WRAP_NAMESPACE(Test, x) // specified in the schema 

struct Car { 
    char name[10]; 
    char model[10]; 
    int year; 
}; 

struct Car getRandomCar() { 
    struct Car randomCar; 
    int a = rand(); 
    if ((a % 2) == 0) { 
     strcpy(randomCar.name, "Ford"); 
     strcpy(randomCar.model, "Focus"); 
    } else { 
     strcpy(randomCar.name, "Dodge"); 
     strcpy(randomCar.model, "Charger"); 
    } 
    randomCar.year = rand(); 
    return randomCar; 
} 

int main (void) 
{ 
    srand(time(NULL)); 

    // Socket to talk to clients 
    void *context = zmq_ctx_new(); 
    void *responder = zmq_socket (context, ZMQ_REP); 
    int rc = zmq_bind (responder, "tcp://*:5555"); 
    assert (rc == 0); 
    int counter = 0; 

    while (1) { 
     struct Car c = getRandomCar(); 

     flatcc_builder_t builder, *B; 
     B = &builder; 
     // Initialize the builder object. 
     flatcc_builder_init(B); 
     uint8_t *buf; // raw buffer used by flatbuffer 
     size_t size; // the size of the flatbuffer 
     // Convert the char arrays to strings 
     flatbuffers_string_ref_t name = flatbuffers_string_create_str(B, c.name); 
     flatbuffers_string_ref_t model = flatbuffers_string_create_str(B, c.model); 

     ns(Car_start_as_root(B)); 
     ns(Car_name_add(B, name)); 
     ns(Car_model_add(B, model)); 
     ns(Car_year_add(B, c.year)); 
     ns(Car_end_as_root(B)); 
     buf = flatcc_builder_finalize_buffer(B, &size); 

     char receiveBuffer [10]; 
     zmq_recv (responder, receiveBuffer, 10, 0); 
     printf ("Received ready signal. Sending car %d.\n", counter); 
     sleep (1);   // Do some 'work' 
     zmq_send (responder, buf, size, 0); 
     counter++; 

     free(buf); 
    } 
    return 0; 
}