2009-12-02 17 views
5

Qualcuno potrebbe aiutarmi e dirmi come utilizzare i buffer di protocollo. In realtà voglio scambiare dati tramite socket tra un programma in esecuzione su Unix e altri in esecuzione su Windows per eseguire studi di simulazione.Come utilizzare i buffer di protocollo?

I programmi che utilizzano le prese per lo scambio di dati, sono scritte in C/C++ e sarei felice se somneone mi potrebbe aiutare ad utilizzare i buffer di protocollo per lo scambio di dati in forma di:

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

Ho provato diversi modi, ma i dati non vengono ancora scambiati correttamente. Qualsiasi aiuto sarebbe molto apprezzato

Grazie per il vostro aiuto,

+6

Qual è il motivo questo è un wiki comunità? – Goz

risposta

11

Si inizia definendo il vostro messaggio in un file di Proto:

package foo; 

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

(credo che il float e double in realtà sono diverse variabili ...)

Poi si compila utilizzando protoc e poi hai il codice che implementa il tuo buffer.

Per ulteriori informazioni si veda: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

+0

Grazie per la risposta. c'è qualche semplice tutorial in cui viene mostrato un esempio? grazie ancora, – make

+2

Segui il link che ho incluso - è un tutorial che copre l'uso dei buffer di protocollo da C++. –

1

Sono entrambe le macchine x86? Altrimenti è necessario guardare le differenze big endian e little endian. Vale anche la pena prestare attenzione a strutturare l'imballaggio. Anche il passaggio del puntatore può essere problematico a causa del fatto che i puntatori sono di dimensioni diverse su piattaforme diverse. Tutto è troppo poco nel tuo post per dire, per certo, cosa sta andando storto ...

+0

le macchine sono diverse. Unix è installato su sun-blade e windows su x86. Ma, ho letto che i buffer del protocollo si occupano di macchine diverse e questo è il motivo per cui ho deciso di usarlo ... – make

0

La risposta sta nella familiarità dei dati trasmessi, questo è qualcosa che devi considerare con molta attenzione e dai un'occhiata. Guarda here per mostrare cosa può fare endianness e causare che i dati vengano incasinati sia sul ricevitore che sul mittente. Non esiste una misura così perfetta di trasferimento dei dati senza problemi, solo perché i dati inviati da una casella unix garantiscono che i dati sulla casella di Windows saranno nello stesso ordine in termini di struttura della memoria per i dati. Anche il padding della struttura sulla casella unix sarà diverso dal padding sulla finestra di windows, si riduce a come vengono utilizzati gli switch della riga di comando, si pensi all'allineamento della struttura.

+2

@ tommieb75: È corretto? Googling per i buffer del protocollo e endian mostra una conversazione di Google Gruppi che indica che il software lo gestisce correttamente: http://groups.google.com/group/protobuf/browse_thread/thread/5dbcc1c028f8c8bf – quamrana

+0

@quamrana: non posso rispondere come faccio io non conosco i buffer di protocollo di google, mi dispiace lì su quello. Controlla il riempimento della tua struttura, il compilatore potrebbe riempirlo per renderlo di dimensioni pari. Puoi verificarlo facendo una sizeof (struct snd_data) su entrambe le estremità per vedere di cosa si tratta? Se ottieni taglie diverse potresti spiegare in qualche modo la tua situazione. – t0mm13b

3

Come stai scrivendo i propri messaggi nella presa di corrente? Protobufs non è endian-sensitive, ma neanche protobuf definisce un meccanismo di trasporto - protobuf definisce una mappatura tra un messaggio e la sua forma serializzata (che è una sequenza di byte (8 bit)) ed è la tua responsabilità di trasferire questa sequenza di byte all'host remoto.

Nel nostro caso, definiamo un protocollo di trasporto molto semplice; per prima cosa scriviamo la dimensione del messaggio come un intero a 32 bit (big endian), quindi viene il messaggio stesso. (Ricorda inoltre che i messaggi protobuf non sono autoidentificanti, il che significa che è necessario sapere quale messaggio si sta inviando, in genere è gestito da un messaggio wrapper contenente campi facoltativi per tutti i messaggi che si desidera inviare. archivi di siti Web e mailing list per ulteriori informazioni su questa tecnica.)

+0

Sì. Per ulteriori dettagli, consulta [https://developers.google.com/protocol-buffers/docs/techniques#streaming](https://developers.google.com/protocol-buffers/docs/techniques#streaming). Protobuf "non è auto-delimitante". –

Problemi correlati