2011-06-18 1 views
1

私の問題は、私はC++アプリはC#のアプリからの連続したメッセージを受信できません

TcpClient con = new TcpClient ("127.0.0.1", 5432); 
      NetworkStream str = con.GetStream(); 
Annoucement msg = new Annoucement(); 
      msg.typ = Annoucement.msgType.NOWY_GRACZ; 

      Serializer.SerializeWithLengthPrefix (str, msg, PrefixStyle.Base128); 
      Serializer.SerializeWithLengthPrefix (str, msg, PrefixStyle.Base128); 

を行うと、私は

私は読むことができます
Connection con = server.accept(); 

    Annoucement ann = con.receive(); 
    cout << ann.typ() << endl; 

    ann = con.receive(); 
    cout << ann.typ() << endl; 

をプロトコルバッファを使用してカスタムライブラリで受信しようとするということです最初のものだけ。フィールドtypは0に設定されているのに対して、フィールド3は3に設定されているので、2番目は間違っています。私は関数が何か間違っていますが、何がわからないと思います。

Annoucement Connection::receive() throw(EmptySocket) { 
    CodedInputStream coded_input(raw_input); 
    google::protobuf::uint32 n; 
    coded_input.ReadVarint32(&n); 
    char *b; 
    int m; 
    coded_input.GetDirectBufferPointer((const void**)&b, &m); 
    Annoucement ann; 
    ann.ParseFromArray(b, n); 
    return ann; 
    } 

一つの変数はコンストラクタで初期化されて、私はソケットからの連続したメッセージを読むことができるように

FileInputStream* raw_input; 
raw_input = new FileInputStream(s); //s is socket in this example communication 

は、どのように私はそれを修正することができますか? referenceから

答えて

1

セットはCodedInputStreamの 基本となるバッファの 未読部分に直接指すようにデータを*、*はそのバッファの サイズにサイズではなく 事前ストリームの処理を行い現在位置。

これは常に 空でないバッファを生成するか、falseを返します。 呼び出し元がこのデータを消費する場合は、 Skip()を呼び出して、消費されたバイトに対して をスキップする必要があります。これは、 のデータタイプの解析ルーチンが、 ではなく、CodedInputStream インターフェイスで実装されている場合に便利です。

  1. 告知の両方が最初の呼び出しでバッファ内にすでにある場合の取り扱い:

は、私はこれらのコード内で欠落している参照してください。

  • coded_input.Skip()(右使用の場合は上記の#1をカバーする必要があります)
  • エラー処理(コール時にバッファに既にアナウンスがない場合を含む)。
  • あなたの問題は上記#3の原因であると推測していますが、ParseFromArrayコードが表示されるまではわかりません。

    関連する問題