2009-12-02 21 views
5

Birisi lütfen yardımcı olur ve protokol arabelleklerini nasıl kullanacağımı söyler. Aslında, simülasyon çalışmalarını yürütmek için unix ve uno üzerinde çalışan bir program arasında soketler arasında veri alışverişi yapmak istiyorum. veri alışverişi için yuvalarını kullanmakProtokol arabellekleri nasıl kullanılır?

programları C/C++ yazılır ve somneone şeklinde veri alışverişi için protokol tamponlarını kullanmak için bana yardımcı olabilirseniz çok sevinirim:

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

Birkaç yol denedim, ancak yine de veriler doğru şekilde değiştirilmiyor. Herhangi bir yardım çok

+6

bu bir sebep var bir topluluk wiki nedir? – Goz

cevap

11

Bir .proto dosyası mesajınızı tanımlayarak başlamak:

package foo; 

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

(float tahmin ve çift aslında farklı değişkenler ...)

Sonra sonra protoc ve onun derlenmesi arabelleğinizi uygulayan kodunuz var. Ayrıntılı bilgi için

bkz: http://code.google.com/apis/protocolbuffers/docs/cpptutorial.html

+0

Cevabınız için teşekkürler. Bir örnek gösterilen herhangi bir basit öğretici var mı? tekrar teşekkürler, – make

+2

İçerdiğim bağlantıyı takip edin - C++ protokolü tamponlarını kapsayan bir öğretici. –

1

iki makinede x86 misiniz,

Yardımlarınız için

Teşekkür mutluluk duyacağız? Aksi halde büyük endian ve küçük endian farklılıkları izlemeniz gerekir. Yapısal ambalajlamaya da dikkat edilmesine değer. İlerleyen işaretçinin farklı platformlarda farklı boyutlarda olması nedeniyle geçiş işaretçisi de sorunlu olabilir. Tüm kesin olarak söylemek yazınıza çok az bilgi vardır içinde ne

cevap iletilen verinin Endianess yatıyor
+0

makineleri farklıdır. Unix, güneş bıçağına ve x86'daki pencerelere takılıdır. Ancak, protokol arabelleklerinin farklı makinelerle uğraştığını okudum ve bu yüzden kullanmaya karar verdim ... – make

0

, bu çok dikkatli dikkate almak gereken bir şey ve bir ... yanlış gittiğini Kontrol. Hangi endianness'in yapılabileceğini göstermek ve hem alıcıda hem de göndericideki verilerin dağılmasına neden olmak için here'a bakın. Bir unix gönderilen veriler pencere kutuyu veri verileri için bellek yapısı bakımından aynı sırada olacak garanti sırf sorunsuz veri aktarımı böyle mükemmel ölçü yoktur. Ayrıca, unix kutusu üzerindeki yapının doldurulması, pencere kutusundaki dolgudan farklı olacaktır, komut satırı anahtarlarının nasıl kullanıldığına, yapı düzeninin nasıl düştüğüne değin kaynar.

+2

@ tommieb75: Bu doğru mu? Protokol tamponları ve endian için Googling, yazılımın bunu doğru şekilde işlediğini gösteren bir Google Grupları sohbeti gösterir: http://groups.google.com/group/protobuf/browse_thread/thread/5dbcc1c028f8c8bf – quamrana

+0

@quamrana: Bunu yaptığım gibi cevaplayamıyorum google 'protokol arabelleklerini bilmiyorum, bu konuda üzgünüm. Yapı dolgunuzu kontrol edin, derleyici onu eşit boyutta yapmak için doldurur. Ne olduğunu görmek için her iki ucunda bir sizeof (struct snd_data) yaparak kontrol edebilirsiniz. Bundan daha farklı boyutlar elde ederseniz durumunuzu açıklamak için bir yol olabilir. – t0mm13b

3

nasıl soketine mesajlarınızı yazıyorsun? Protobufs kendisi endian duyarlı değildir, ama ne yapar protobufs bir taşıma mekanizması tanımlayan - protobuf ((8-bit) bir dizi bayt olan) bir mesaj ve seri biçimde arasında bir eşleme tanımlar ve konumuna sorumluluğundadır Bu bayt dizisini uzak ana bilgisayara aktarın. Bizim durumumuzda

, çok basit taşıma protokolü tanımlar; önce mesaj boyutunu 32 bitlik bir tamsayı olarak yazıyoruz (büyük endian), mesajın kendisi geliyor. (Ayrıca protobuf mesajları size. Bu tipik göndermek istediğiniz tüm iletiler için isteğe bağlı alanları içeren bir sarıcı mesajı alarak yönetilmektedir gönderiyor hangi mesajı bilmek gerekir, yani kendini tanımlama olmadığını unutmayın. Protobuf bakın Bu teknik hakkında daha fazla bilgi için web sitesi ve posta listesi arşivleri.)

+0

Evet. Daha fazla ayrıntı için, bkz. [Https://developers.google.com/protocol-buffers/docs/techniques#streaming](https://developers.google.com/protocol-buffers/docs/techniques#streaming]. Protobuf "kendi kendini sınırlandırma" değildir. –

İlgili konular