私は、クライアント用の c# とサーバー用の c++ で Protobuf3 を利用しています。.proto は、対応する protoc3 コンパイラから生成されます。私は現在、クライアントから送信されたサーバー上の受信バイトを再解析して、元の google::protobuf::Message に戻す方法を見つけようとしています。私のC ++サーバー上のオブジェクト。
私のクライアントは C# で CodedOutputStream を送信しています:
public PacketHandler()
{
m_client = GetComponent<ClientObject>();
m_packet = new byte[m_client.GetServerConnection().GetMaxPacketSize()];
m_ostream = new BinaryWriter(new MemoryStream(m_packet));
}
public void DataToSend(IMessage message)
{
CodedOutputStream output = new CodedOutputStream(m_ostream.BaseStream, true);
output.WriteMessage(message);
output.Flush();
m_client.GetServerConnection().GetClient().Send(m_packet, message.CalculateSize());
}
これは機能しているようです。現在送信されているメッセージは、次のような単純な Ping メッセージです。
// Ping.proto
syntax = "proto3";
package server;
import "BaseMessage.proto";
message Ping {
base.BaseMessage base = 1;
}
message Pong {
base.BaseMessage base = 1;
}
私の BaseMessage は次のようになります。
// BaseMessage.proto
syntax = "proto3";
package base;
message BaseMessage {
uint32 size = 1;
}
私の計画は、できればすべてのメッセージを BaseMessage から拡張して、最終的に特定のメッセージを識別できるようにすることです。解析と再解析を理解したら。
C++ サーバー側で受信したメッセージは次のようになります: \u0004\n\u0002\b
メッセージを受信すると、受信したバイトを解析しようとすることで CodedInputStream オブジェクトを使用して再解析しようとしています。
PacketHandler::PacketHandler(QByteArray& packet, const Manager::ClientPtr client) :
m_packet(packet),
m_client(client)
{
//unsigned char buffer[512] = { 0 };
unsigned char data[packet.size()] = { 0 };
memcpy(data, packet.data(), packet.size());
google::protobuf::uint32 msgSize;
google::protobuf::io::CodedInputStream inputStream(data, packet.size());
//inputStream.ReadVarint32(&msgSize);
//inputStream.ReadRaw(buffer, packet.size());
server::Ping pingMsg;
pingMsg.ParseFromCodedStream(&inputStream);
qDebug() << pingMsg.base().size();
}
これは、メッセージを特定のメッセージに再解析するために実行する必要があるプロセスが少しわからないところです。すべてのメッセージを拡張する BaseMessage を利用すれば、特定のメッセージを識別できるので、どのメッセージを作成すればよいかがわかると思います。ただし、Ping メッセージになることがわかっているこの現在のテストでは、ParseFromCodedStream は元のメッセージを作成していないようです。私の推論は、qDebug() 中に pingMsg.base().size() が私の c# クライアントの送信段階で設定された正しい値ではないことに由来します。