2012-07-24 9 views
12

protobufを使用してメッセージをシリアライズしています。これはC++でソケット接続を介して送信します。私はメッセージの長さを示すメッセージにヘッダーを追加したいと思います。この実装についてどう思いますか?私はいくつかの研究を行い、それが私がまとめたものです。C++のprotobufメッセージの長さプレフィックス

これを行うにはより良い方法がありますか?この実装によって問題が生じる可能性はありますか?私は、Java用のAPIサポートがあることを知っていますが、残念ながらC++ではサポートされていません。

bool send_message(int socket, my_protobuf::Message message) 
{ 
    google::protobuf::uint32 message_length = message.ByteSize(); 
    int prefix_length = sizeof(message_length); 
    int buffer_length = prefix_length + message_length; 
    google::protobuf::uint8 buffer[buffer_length]; 

    google::protobuf::io::ArrayOutputStream array_output(buffer, buffer_length); 
    google::protobuf::io::CodedOutputStream coded_output(&array_output); 

    coded_output.WriteLittleEndian32(message_length); 
    message.SerializeToCodedStream(&coded_output); 

    int sent_bytes = write(socket, buffer, buffer_length); 
    if (sent_bytes != buffer_length) { 
    return false; 
    } 

    return true; 
} 

bool recv_message(int socket, my_protobuf::Message *message) 
{ 
    google::protobuf::uint32 message_length; 
    int prefix_length = sizeof(message_length); 
    google::protobuf::uint8 prefix[prefix_length]; 

    if (prefix_length != read(socket, prefix, prefix_length)) { 
    return false; 
    } 
    google::protobuf::io::CodedInputStream::ReadLittleEndian32FromArray(prefix, 
     &message_length); 

    google::protobuf::uint8 buffer[message_length]; 
    if (message_length != read(socket, buffer, message_length)) { 
    return false; 
    } 
    google::protobuf::io::ArrayInputStream array_input(buffer, message_length); 
    google::protobuf::io::CodedInputStream coded_input(&array_input); 

    if (!message->ParseFromCodedStream(&coded_input)) { 
    return false; 
    } 

    return true; 
} 
+1

これを参照してください[回答](http://stackoverflow.com/questions/2340730/are-there-c-equivalents-for-the-protocol-buffers-delimited-io-functions-in-ja) – alavrik

+0

それですバッファは、unsigned int8型である必要がありますか? – Chani

+0

socket-> write()はgoogle :: protobuf :: uint8型のバッファをどのように受け入れますか? – Chani

答えて

5

それは(あなたがWriteLittleEndian32を持っている場合)fixed32のではなく、(例えばWriteVarint32)varintを使用する方が一般的だが、長さで付けることによっているProtobufストリームを区切るの実践は音です。

関連する問題